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?

Kohjah Breese
fuente

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
conductor de acero
fuente
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

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

prueba esto,

tail -n +43 dump.sql > dump_new.sql

ptantiku
fuente
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

Steven Penny
fuente
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.

kb2bcg
fuente
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
souravc
fuente
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
Jerinaw
fuente
0

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

Akash Agarwal
fuente