reemplazar - Cómo eliminar líneas en blanco de un archivo Unix
sed reemplazar (8)
Para ser minucioso y eliminar líneas, incluso si incluyen espacios o pestañas, algo así en Perl lo hará:
cat file.txt | perl -lane "print if //S/"
Por supuesto, están los awk y sed equivalentes. Lo mejor es no asumir que las líneas están totalmente en blanco, ya que ^$
haría.
Aclamaciones
Necesito eliminar todas las líneas en blanco de un archivo de entrada y escribir en un archivo de salida. Aquí están mis datos como a continuación.
11216,33,1032747,64310,1,0,0,1.878,0,0,0,1,1,1.087,5,1,1,18-JAN-13,000603221321
11216,33,1033196,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,059762153003
11216,33,1033246,31300,1,0,0,1.5391,0,0,0,1,1,1.054,5,1,1,18-JAN-13,000603211032
11216,33,1033280,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,055111034001
11216,33,1033287,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000378689701
11216,33,1033358,31118,1,0,0,1.5513,0,0,0,1,1,1.115,5,1,1,18-JAN-13,000093737301
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041926
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802041954
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049326
11216,33,1035476,37340,1,0,0,1.7046,0,0,0,1,1,1.123,5,1,1,18-JAN-13,045802049383
11216,33,1036985,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000093415580
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781202001
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781261305
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781603955
11216,33,1037003,15151,1,0,0,1.4436,0,0,0,1,1,1.065,5,1,1,18-JAN-13,000781615746
Puede usar la opción -i
para editar in situ sin usar un archivo temporal:
sed -i ''/^$/d'' file
Use grep para hacer coincidir cualquier línea que no tenga nada entre el ancla de inicio ( ^
) y el anclaje final ( $
):
grep -v ''^$'' infile.txt > outfile.txt
Si desea eliminar líneas con solo espacios en blanco, aún puede usar grep. Estoy usando expresiones regulares de Perl en este ejemplo, pero aquí hay otras formas:
grep -P -v ''^/s*$'' infile.txt > outfile.txt
o, sin expresiones regulares de Perl:
grep -v ''^[[:space:]]*$'' infile.txt > outfile.txt
con awk
awk ''NF > 0'' filename
awk ''NF'' filename
awk ''NF > 0'' filename
sed -i ''/^$/d'' filename
awk ''!/^$/'' filename
awk ''/./'' filename
El NF también elimina las líneas que contienen solo espacios en blanco o pestañas, la expresión regular /^$/
no lo hace.
grep . file
grep mira tu archivo línea por línea; el punto coincide con cualquier cosa excepto un carácter de nueva línea. La salida de grep es, por lo tanto, todas las líneas que constan de algo más que una sola nueva línea.
sed -e ''/^ *$/d'' input > output
Elimina todas las líneas que constan solo de espacios en blanco (o está completamente vacía). Puede cambiar el espacio en blanco a [ /t]
donde /t
es una representación de la pestaña. Si su caparazón o su sed
harán la expansión varía, pero probablemente pueda escribir el carácter de tabulación directamente. Y si está utilizando GNU o BSD sed
, puede hacer la edición in situ, si eso es lo que quiere, con la opción -i
.
Si ejecuto el comando anterior todavía tengo líneas en blanco en mi archivo de salida. ¿Cuál podría ser la razón?
Puede haber varias razones. Puede ser que no tenga líneas en blanco, pero tiene muchos espacios al final de una línea, de modo que parece que tiene líneas en blanco cuando coloca el archivo en la pantalla. Si ese es el problema, entonces:
sed -e ''s/ *$//'' -e ''/^ *$/d'' input > output
La nueva expresión regular elimina espacios en blanco repetidos al final de la línea; ver discusión previa para espacios en blanco o pestañas.
Otra posibilidad es que su archivo de datos provenga de Windows y tenga terminaciones de línea CRLF. Unix ve el retorno de carro al final de la línea; no está en blanco, por lo que la línea no se elimina. Hay múltiples formas de lidiar con eso. Uno confiable es tr
para borrar el código de carácter ( -d
) octal 15, también conocido como control-M o retorno de carro:
tr -d ''/015'' < input | sed -e ''s/ *$//'' -e ''/^ *$/d'' > output
Si ninguno de esos trabajos, entonces necesitas mostrar un volcado hexadecimal o volcado octal ( od -c
) de las primeras dos líneas del archivo, para que podamos ver a qué nos enfrentamos:
head -n 2 input | od -c
A juzgar por los comentarios que sed -i
no funciona para usted, no está trabajando en Linux, Mac OS X o BSD, ¿en qué plataforma está trabajando? (Me vienen a la mente AIX, Solaris, HP-UX como posibilidades relativamente plausibles, pero también hay muchas otras menos plausibles).
Puede probar las clases de caracteres nombrados POSIX como sed -e ''/^[[:space:]]*$/d''
; probablemente funcionará, pero no está garantizado. Puedes intentarlo con:
echo "Hello World" | sed ''s/[[:space:]][[:space:]]*/ /''
Si funciona, habrá tres espacios entre ''Hola'' y ''Mundo''. Si no, probablemente obtendrá un error de sed
. Eso podría ahorrarte pena por obtener pestañas escritas en la línea de comando.
sed -i ''/^$/d'' foo
Esto le dice a sed
que elimine cada línea que coincida con la expresión regular ^$
es decir, cada línea vacía. El -i
edita el archivo in situ, si su sed
no admite que pueda escribir el resultado en un archivo temporal y reemplazar el original:
sed ''/^$/d'' foo > foo.tmp
mv foo.tmp foo
Si también desea eliminar líneas que consisten únicamente en espacios en blanco (no solo líneas vacías), utilice:
sed -i ''/^[[:space:]]*$/d'' foo
Editar: también elimina los espacios en blanco al final de las líneas, porque aparentemente has decidido que también lo necesitas:
sed -i ''/^[[:space:]]*$/d;s/[[:space:]]*$//'' foo