Insertar una nueva línea después de cada N líneas?


24

¿Cómo puedo usar las herramientas de procesamiento de texto para insertar una nueva línea después de cada N líneas?

Ejemplo para N = 2:

ENTRADA:

sadf
asdf
yxcv
cxv
eqrt
asdf

SALIDA:

sadf
asdf

yxcv
cxv

eqrt
asdf

Respuestas:


28

Con awk:

awk ' {print;} NR % 2 == 0 { print ""; }' inputfile

Con sed( GNUextensión):

sed '0~2 a\\' inputfile

Con bash:

#!/bin/bash
lines=0
while IFS= read -r line
do
    printf '%s\n' "${line}"
    ((lines++ % 2)) && echo
done < "$1"

2
Evaluación aritmética puede ser utilizado directamente como condición, sin necesidad de que el [[ ]]hacer la prueba: while read line; do echo "$line"; ((lines++ % 2)) && echo; done.
manatwork

1
Tenga en cuenta que el comando documentado anterior sed '0~2 a\ 'agrega un espacio a cada nueva línea insertada. Si desea agregar un salto de línea después de cada línea, ninguno de estos trabajos de manera similar: sed '0~1 a\ ', sed 'a\ 'o simplemente sed G.
Acumenus

5

Utilizando paste

 paste -d'\n' - - /dev/null <file

4
sed n\;G <infile

... es todo lo que necesitas ...

Por ejemplo:

seq 6 | sed n\;G

SALIDA:

1
2

3
4

5
6

... (y un espacio en blanco sigue al 6 también) ... o ...

seq 5 | sed n\;G

SALIDA:

1
2

3
4

5

(y ningún espacio en blanco sigue a los 5)

Si siempre se debe omitir un espacio en blanco en un caso de última línea:

sed 'n;$!G' <infile

2

Otro sabor awk:

awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'

1
"Esta respuesta se marcó como de baja calidad debido a su longitud y contenido". Lo aceptaré ... ;-)
Hauke ​​Laging

1

sed (GNU)

Con (GNU) sed:

sed '0~2G'

Corto (feo para N = 100):

sed 'n;G'

Man sed explica ~ como:

primer ~ paso
Haga coincidir cada línea de paso comenzando con la línea primero. Por ejemplo, `` sed -n 1 ~ 2p '' imprimirá todas las líneas impares en la secuencia de entrada, y la dirección 2 ~ 5 coincidirá con cada quinta línea, comenzando con la segunda. primero puede ser cero; en este caso, sed opera como si fuera igual al paso. (Esta es una extensión).

sed (otro)

Con otros sed (Cuenta nuevas líneas):

sed -e 'p;s/.*//;H;x;/\n\{2\}/{g;p};x;d'

O, para ser más portátil, escrito como (eliminar comentarios para algunas versiones de sed):

sed -e '             # Start a sed script.
         p            # Whatever happens later, print the line.
         s/.*//       # Clean the pattern space.
         H            # Add **one** newline to hold space.
         x            # Get the hold space to examine it, now is empty.
         /\n\{2\}/{   # Test if there are 2 new lines counted.
             g        # Erase the newline count.
             p        # Print an additional new line.
           }          # End the test.
         x            # match the `x` done above.
         d            # don't print anything else. Re-start.
       '              # End sed script.

awk

Con awk, probablemente:

awk '1 ; NR%2==0 {printf"\n"} '
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.