2009-06-10 17 views
18

Tengo un archivo de entrada como esta:¿Cómo inserto una línea en blanco cada n líneas usando awk?

line 1 
line 2 
line 3 
line 4 
line 5 
line 6 

me gustaría usar awk para insertar una línea en blanco cada pocas líneas; por ejemplo, cada dos:

line 1 
line 2 

line 3 
line 4 

line 5 
line 6 

¿Cómo puedo obtener awk para poner una línea en blanco en mi archivo de cada n líneas?

Respuesta

17
awk '{ if ((NR % 5) == 0) printf("\n"); print; }' 

para n == 5, por supuesto. Sustituye lo que sea tu idea de n.

+0

Si n = 1, el siguiente parece funcionar: 'awk '{print; printf ("\ n");} ''o simplemente ' awk' {print; print "";} '' –

+0

Esto colocará la primera nueva línea antes de la 5ta línea en lugar de después. la impresión y el printf deben invertirse. – Scrutinizer

1
$ awk -v n=5 '$0=(!(NR%n))?"\n"$0:$0' 

Si quiere cambiar 'n', configure el parámetro 'n' con la opción -v de awk.

+0

Eso será problemático cuando una línea está en blanco o consiste en un cero. – Scrutinizer

24

Una forma más "awk-ish" para escribir la respuesta de smcameron:

awk -v n=5 '1; NR % n == 0 {print ""}' 

El "1"; es una condición que siempre es verdadera y activará la acción predeterminada que es imprimir la línea actual.

+0

Lo mismo aquí, ¿no? la línea de impresión y la nueva línea de impresión deberían invertirse; de ​​lo contrario, la nueva línea se imprimirá antes de cada 5ª línea en lugar de después. – Scrutinizer

+0

Muy bien. actualizado. –

+3

Probablemente escribiría eso como ''{print} NR% n == 0 {print"'} ', pero eso es puramente un problema de estilo. – Vatine

3
awk '{print; if (FNR % 5 == 0) printf "\n";}' your_file 

Creo que 'print' debe estar antes de 'printf', y FNR es más preciso para su tarea.

3

Más awkishness:

awk 'ORS=NR%5?RS:RS RS' 

Por ejemplo:

$ printf "%s\n" {1..12} | awk 'ORS=NR%5?RS:RS RS' 
1 
2 
3 
4 
5 

6 
7 
8 
9 
10 

11 
12 
Cuestiones relacionadas