¿Cómo elimino las primeras n líneas de un archivo ascii usando comandos de shell?

93

Tengo varios archivos que contienen información de texto ascii en las primeras 5-10 líneas, seguidos de información de matriz bien tabulada. En un script de shell, quiero eliminar estas primeras líneas de texto para poder usar la información de matriz pura en otro programa. ¿Cómo puedo usar los comandos bash shell para hacer esto?

Si es de alguna ayuda, estoy usando RedHat y un sistema Linux Linux.

Pablo
fuente

Respuestas:

144

Siempre que el archivo no sea un enlace simbólico o un enlace rígido, puede usar sed, tail o awk. Ejemplo a continuación.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

También puede usar sed en el lugar sin un archivo temporal: sed -i -e 1,3d yourfile. Esto no hará eco de nada, solo modificará el archivo en el lugar. Si no necesita canalizar el resultado a otro comando, esto es más fácil.

cola

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
Ignacio Vazquez-Abrams
fuente
8
También puede usar sed en el lugar sin un archivo temporal: sed -i -e 1,3d yourfile. Esto no hará eco de nada, solo modificará el archivo en el lugar. Si no necesita canalizar el resultado a otro comando, esto es más fácil.
Yanick Girouard
1
Gracias @YanickGirouard, @IgnacioVazquezAbrams! ¡Ustedes dos me han ahorrado un montón de trabajo manual en mi investigación! :)
Paul
2
@Svetlana sed -iespecíficamente. La mayoría de las implementaciones simplemente eliminan el archivo y lo reemplazan por uno nuevo, que no funciona para los enlaces, ya que terminas dejando el original en su otra ubicación.
jw013
66
¿qué tal explicar qué '1,3d', +4, et.c. ¿medio? La pregunta era para n líneas, pero no dijiste qué es n (ya que aparentemente n es 2 en tus ejemplos, aunque no es obvio para un novato qué cambiar para cambiar n)
Robin Manoli
3
Esto utiliza un archivo temporal, por lo que no es muy útil para un espacio de disco 100% util. Sería interesante tener una solución que haga esto literalmente "en el lugar".
Shai
10

sed -i '1,3d' file.txt

Esto elimina las primeras 3 líneas de file.txt.

alhelal
fuente
6

Si las líneas tabuladas son las que tienen un carácter de tabulación:

grep '␉' <input_file >output_file

( siendo un carácter de tabulación literal) o equivalente

sed -n '/␉/p' <input_file >output_file

En un script bash / ksh / zsh, puede escribir $'\t'para una pestaña, por ejemplo, grep $'\t'o sed -n $'/\t/p'.

Si desea eliminar 10 líneas al comienzo del archivo:

tail -n +11 <input_file >output_file

(tenga en cuenta que es +11para eliminar 10 líneas, porque +11significa "comenzar desde la línea 11" y las líneas de números de cola desde 1) o

sed '1,10d' <input_file >output_file

En Linux, puede aprovechar la -iopción de GNU sed para modificar los archivos en su lugar:

sed -i -n '/\t/p' *.txt

O puede usar un bucle de shell y archivos temporales:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

O si no desea modificar los archivos en su lugar, sino que les da un nombre diferente:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
Gilles
fuente
3
"tabulado" generalmente significa "bonito impreso en una tabla", no "sangrado con caracteres de tabulación".
Ignacio Vázquez-Abrams
@ IgnacioVazquez-Abrams Lo sé. La tabla impresa a veces usa caracteres de tabulación, que es más fácil de detectar que las columnas alineadas. Por supuesto, si Paul dio una entrada de muestra, podría dar una mejor coincidencia.
Gilles
2

Puede usar Vim en modo Ex:

ex -sc '1d5|x' file
  1. 1 pasar a la primera línea

  2. 5 seleccione 5 líneas

  3. d Eliminar

  4. x guardar y cerrar

Steven Penny
fuente
0

echo "a \ nb" | sed '1d' # elimina la primera línea

cat list.txt | sed '1d'> list.csv # lee list.txt y escribe list.csv sin la primera línea

Otros comandos útiles:

grep '^ |' # encuentra el primer carácter (tubería |)

sed 's / | // g' # elimina la tubería

sed 's / // g' # elimina espacio

Samran Elahi
fuente
0

Por porcentaje

Usando bash, para limpiar un archivo usando un número de porcentaje en lugar de un número absoluto de líneas:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

Tenga cuidado porque ese comando puede ser destructivo ya que elimina el contenido in situ, sin crear una copia.

Elimina el primer 75% de las líneas del archivo mencionado.

pgr
fuente