Eliminar las primeras n líneas de un archivo de texto grande


63

Necesito eliminar las primeras 42 líneas de un volcado SQL de 2GB.

Sé que puedo ver las primeras líneas usando:

head -n 44 dump.sql

Pero, ¿hay alguna forma de editarlos o eliminarlos?

Respuestas:


91

Si solo desea ver las líneas de la 43 en adelante, puede usar

tail -n +43 dump.sql

El +signo es importante: sin él, tailimprimirá las últimas 43 líneas. Alternativamente con 'sed'

sed 1,42d dump.sql

Si realmente desea eliminar las primeras 42 líneas del archivo original, puede hacer que sed realice el cambio en el lugar con la -iopción

sed -i 1,42d dump.sql

Impresionante respuesta, fantástico uso de tail. Encontré muchas veces algo nuevo que aprender de sus respuestas. Gracias.
souravc

1
Oh man tail -n +43 es un cambio de juego! He estado usando una invocación incómoda de sed con el mismo efecto.
pfctdayelise

44
¿Qué pasa si no le queda espacio en el dispositivo? sed -i 1,50000000d 17GigFilecrea un archivo temporal sedXYZque consume muchos más gigabytes. ¿Hay un enfoque sin archivos temporales?
juanmf

¿Cuál es la diferencia entre tail -n +43y head -n 44como se menciona en la pregunta?
Hashim

@juanmf Puede intentar hacer esto con una herramienta de interfaz gráfica de usuario (lo he hecho usando Mousepad, pero el archivo de interés era "solo" ~ 700 MB. Sin embargo, el archivo tarda un poco en cargar ...
Digger

18

Esto parece ser lo más fácil:

sed '1,42d' test.sql > test2.sql

Elimine las líneas 1-42 de test.sql y guárdelas como test2.sql


99
una más corta sería sed -i '1,42d' test.sql si no necesita conservar el archivo original.
Sadi


3

Puede usar Vim en modo Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 pasar a la primera línea

  2. 42 seleccione 42 líneas

  3. d Eliminar

  4. x guardar y cerrar


1
¿Crea un archivo temporal? ¿Es posible hacer esto cuando el espacio restante en el dispositivo es menor que el tamaño del archivo?
juanmf

2
@juanmf Todas estas soluciones requieren un archivo temporal. Solo es posible eliminar datos del final de un archivo sin usar un archivo temporal.
PerlDuck

0

Lo siento, no puedo darte el código actual en este momento. Sin embargo, intente mirar algo en la línea de

tail -n arcv(`wc -l`) -44

Lo que esto debería hacer (una vez formateado correctamente) es contar el número de líneas en el archivo (wc -l), restar 44 de él (-44) y luego imprimir todo comenzando con la línea 45 del archivo.

Espero que esto ayude y buena suerte.


Esto no es del todo óptima, llamando wc -len el archivo, que lo procesa dos veces, mientras que sedo tailprocesar una sola vez.
yo '

0

Prueba esto,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

o,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new

0

Solo para agregar esto. Si está en una Mac, debe agregar la extensión de copia de seguridad. Respuesta de esta publicación .

sed -i '.bak' 1,42d dump.sql

0

Debido a las seddiscrepancias entre Linux y Mac, decidí usar el tail -n +43 dump.sql > dump.sqlformato.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.