Rimuovi le prime n righe di un file di testo di grandi dimensioni


63

Devo rimuovere le prime 42 righe di un dump SQL da 2 GB.

So di poter visualizzare le prime righe usando:

head -n 44 dump.sql

Ma c'è comunque modo di modificarli o rimuoverli?

Risposte:


91

Se vuoi solo vedere le linee dalla 43a in poi puoi usare

tail -n +43 dump.sql

Il +segno è importante: senza di esso, invece, tailverranno stampate le ultime 43 righe. In alternativa con 'sed'

sed 1,42d dump.sql

Se vuoi veramente cancellare le prime 42 righe dal file originale, allora puoi fare in modo che il cambiamento avvenga sul posto con l' -iopzione

sed -i 1,42d dump.sql

Risposta fantastica, uso fantastico di tail. Ho trovato molte volte qualcosa di nuovo da imparare dalle tue risposte. Grazie.
souravc,

1
Oh man tail -n +43 è un punto di svolta! Ho usato un'invocazione imbarazzante di sed con lo stesso effetto.
pfctdayelise,

4
Cosa succede se non hai spazio sul dispositivo? sed -i 1,50000000d 17GigFilecrea un file temporaneo sedXYZche consuma molti più gigabyte. Esiste un approccio senza file temporanei?
juanmf,

Qual è la differenza tra tail -n +43e head -n 44come menzionato nella domanda?
Hashim,

@juanmf Potresti provare a farlo con uno strumento gui (l'ho fatto usando Mousepad, ma il file di interesse era "solo" ~ 700 MB. Ci vuole del tempo per caricare il file, però ...
Digger

18

Questo sembra essere il più semplice:

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

Rimuovere le righe 1-42 da test.sql e salvare come test2.sql


9
uno più corto sarebbe sed -i '1,42d' test.sql se non è necessario conservare il file originale.
Sadi


3

Puoi usare Vim in modalità Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 passa alla prima riga

  2. 42 seleziona 42 righe

  3. d Elimina

  4. x salva e chiudi


1
Crea un file temporaneo? È possibile farlo quando lo spazio lasciato sul dispositivo è inferiore alla dimensione del file?
juanmf,

2
@juanmf Tutte queste soluzioni richiedono un file temporaneo. È possibile rimuovere i dati solo dalla fine di un file senza utilizzare un file temporaneo.
PerlDuck,

0

Mi dispiace, non posso darti il ​​codice attuale in questo momento. Tuttavia, prova a guardare qualcosa sulla falsariga di

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

Ciò che dovrebbe fare (una volta formattato correttamente) è contare il numero di righe nel file (wc -l), sottrarre 44 da esso (-44) e quindi stampare tutto a partire dalla 45a riga nel file.

Spero che questo aiuti e buona fortuna.


Questo non è proprio ottimale, chiamando wc -lsul file, si elabora due volte, mentre sedo tailelaborare una sola volta.
yo

0

Prova questo,

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 per aggiungere questo. Se sei su un Mac devi aggiungere l'estensione di backup. Risposta da questo post .

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

0

A causa delle seddiscrepanze tra Linux e Mac, ho deciso di utilizzare il tail -n +43 dump.sql > dump.sqlformato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.