vaciar reemplazar que por lineas empiezan eliminar contenido contar caracter blanco archivo unix awk blank-line

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