¿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
¿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:
Con awk
:
awk ' {print;} NR % 2 == 0 { print ""; }' inputfile
Con sed
( GNU
extensió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"
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
.
sed n\;G <infile
... es todo lo que necesitas ...
Por ejemplo:
seq 6 | sed n\;G
1
2
3
4
5
6
... (y un espacio en blanco sigue al 6 también) ... o ...
seq 5 | sed n\;G
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
Otro sabor awk:
awk '{ l=$0; getline; printf("%s\n%s\n\n", l, $0) }'
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).
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.
Con awk
, probablemente:
awk '1 ; NR%2==0 {printf"\n"} '
[[ ]]
hacer la prueba:while read line; do echo "$line"; ((lines++ % 2)) && echo; done
.