
He analizado un archivo pero hay algún problema y una forma rápida de solucionarlo es reemplazar la línea vacía con la línea debajo, entonces, ¿cómo lo hago?
como el siguiente archivo
apple
banana
big
sig
cake
debe convertirse a
apple
banana
banana
big
sig
cake
cake
Respuesta1
Con sed
:
sed -ne '/./!{n;p;}' -e p your-file
/./! action
ejecuta la acción (aquí recupera la n
línea ext yp
la imprime) para las líneas que lo hacenno( !
) contiene un solo carácter ( .
es el operador de expresiones regulares que coincide con cualquier carácter).
Algunas sed
implementaciones también tienen una opción -i
o -i ''
para editar el archivo in situ.
Respuesta2
Puedes hacer esto awk
con su getline()
función. El comando funciona seleccionando las líneas vacías en el archivo de texto !NF
, es decir, aquellas líneas que están vacías (el número de campos dentro de la línea es 0). Utilizando elgetline()
función obtenemos elpróximolínea inmediata de la línea vacía y almacenar en la variable nxt
.
awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file
Luego, la parte interna {..}
construye una línea que combina la variable, una nueva línea incrustada (concatenación de cadenas con ORS
) y la variable nuevamente. El segundo anexo es necesario porque getline()
la llamada de forma predeterminada avanza el puntero de línea un nivel. Ver¿Cómo cambiar permanentemente un archivo usando awk? (ediciones "in situ", como con "sed -i")para cambiar el archivo dinámicamente.
Respuesta3
$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake
o
awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file
lo que da el mismo resultado.
Esto imprime cada línea 1 vez, más el número de veces correspondiente al número de líneas en blanco encima de ella. Las líneas en blanco se cuentan en la variable r
.
Las líneas en blanco se detectan con la expresión regular ^$
, pero también puedes usar length == 0
o NF == 0
.
Respuesta4
Puede hacer esto de la siguiente manera:
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp