2012-06-27 31 views
6

¿Cómo puedo eliminar la primera (!) Línea de un archivo de texto si está vacío, usando, por ejemplo, sed u otras herramientas estándar de UNIX. Probé este comando:Eliminar la primera línea de archivo si está vacía

sed '/^$/d' < somefile 

pero esto va a eliminar la primera línea vacía, no es la primera línea del archivo, si está vacío. ¿Puedo darle alguna condición a sed sobre el número de línea?

con la respuesta de Levon que construyó este pequeño script basado en awk:

#!/bin/bash 

for FILE in $(find some_directory -name "*.csv") 
do 
    echo Processing ${FILE} 

    awk '{if (NR==1 && NF==0) next};1' < ${FILE} > ${FILE}.killfirstline 
    mv ${FILE}.killfirstline ${FILE} 

done 
+0

¿Quiere decir delete-in-place? – Levon

+0

¿A qué te refieres con en el lugar? Si quieres decir "no generar archivo temporal", en realidad no me importa. Creo que puedo cambiar el nombre del archivo resultante después. – Arne

+0

Sí, me preguntaba si quería modificar el archivo en sí mismo en el lugar. – Levon

Respuesta

11

La cosa más sencilla que sed es:

sed '1{/^$/d}' 

Tenga en cuenta que esto no borra una línea que contiene todos los espacios en blanco, pero sólo una línea que contiene nada más que una nueva línea individual.Para deshacerse de los espacios en blanco:

sed '1{/^ *$/d}' 

y eliminar todos los espacios:

sed '1{/^[[:space:]]*$/d}' 
+0

Eso es lo que estaba buscando. No me di cuenta, tenía que usar las llaves. La documentación de sed es un poco escasa ... – Arne

+0

@Arne Una vez que decidiste hacerlo en el lugar y para usar 'sed', aceptaste la mejor respuesta. (Y * I * aprendí mucho sobre 'sed' hoy :) Me alegra que todo salga bien. – Levon

2

Si usted no tiene que hacer esto en contexto, puede utilizar awk y redirigir la salida en un archivo diferente.

awk '{if (NR==1 && NF==0) next};1' somefile 

Esto imprimirá el contenido del archivo excepto si se trata de la primera línea (NR == 1) y no contiene ningún dato (NF == 0).

NR el número corriente de línea, NF el número de campos en una línea dada separados por espacios en blanco/pestañas

Eg,

$ cat -n data.txt 
    1 
    2 this is some text 
    3 and here 
    4 too 
    5 
    6 blank above 
    7 the end 

$ awk '{if (NR==1 && NF==0) next};1' data.txt | cat -n 
    1 this is some text 
    2 and here 
    3 too 
    4 
    5 blank above 
    6 the end 

y

cat -n data2.txt 
    1 this is some text 
    2 and here 
    3 too 
    4 
    5 blank above 
    6 the end 

$ awk '{if (NR==1 && NF==0) next};1' data2.txt | cat -n 
    1 this is some text 
    2 and here 
    3 too 
    4 
    5 blank above 
    6 the end 

actualización:

Esta solución sed debería funcionar también para el reemplazo en el lugar:

sed -i.bak '1{/^$/d}' somefile 

El archivo original se guardará con una extensión .bak

+0

Su versión sed no funciona: mata a la primera línea vacía que encuentra. Pero la versión awk funcionó bien. Actualizaré mi pregunta con el script de envoltura pequeña que escribí sobre la llamada awk, para que parezca in situ. – Arne

+0

@Arne ... perdón, pegué la cadena incorrecta - mi respuesta se ha actualizado con la línea 'sed' correcta: -/... me molestó no tener una solución sed antes. – Levon

1

usando sed, intente esto:

sed -e '2,$b' -e '/^$/d' < somefile 

oa hacer el cambio en su lugar:

sed -i~ -e '2,$b' -e '/^$/d' somefile 
+1

Tenga en cuenta que esta respuesta no requiere GNU sed como los demás. –

+0

Tienes un punto para eso. Cuando estoy en una máquina Solaris, usaré su respuesta. En mi Mac, he instalado gse, pero es bueno tener una solución que también funcione con BSD sed. – Arne

0

Esto podría trabajar para usted:

sed '1!b;/^$/d' file 
1

Eliminar la primera línea de todos los archivos en el directorio actual si la primera línea está vacía:
find -type f | xargs sed -i -e '2,$b' -e '/^$/d'

0

La respuesta inicial es correcta, algo extra: si está buscando hacer esto recursivamente y limitarlo a un tipo de archivo, lo siguiente lo hará.

find . -name "*.py" -print0 | xargs -0 sed -i '1{/^$/d}' 

el ejemplo anterior se busca en el directorio actual hacia abajo, para todos los *.py archivos (archivos de Python). Cambia la extensión, cambia los archivos en los que actúa.

Cuestiones relacionadas