Usuń pierwsze n linii dużego pliku tekstowego

63

Muszę usunąć pierwsze 42 wiersze zrzutu SQL 2 GB.

Wiem, że mogę wyświetlić pierwsze wiersze, używając:

head -n 44 dump.sql

Ale czy istnieje możliwość ich edycji lub usunięcia?

Kohjah Breese
źródło

Odpowiedzi:

91

Jeśli chcesz po prostu wyświetlić linie od 43-go, możesz użyć

tail -n +43 dump.sql

+Znak jest ważne - bez niego, tailbędzie wydrukować ostatnie zamiast 43 wierszy. Alternatywnie z „sed”

sed 1,42d dump.sql

Jeśli chcesz naprawdę usunąć pierwsze 42 wiersze z oryginalnego pliku, możesz sprawić, by sed wprowadził zmianę za pomocą -iopcji

sed -i 1,42d dump.sql
steeldriver
źródło
Świetna odpowiedź, fantastyczne wykorzystanie tail. Wiele razy znalazłem coś nowego do nauczenia się na podstawie twoich odpowiedzi. dzięki.
souravc
1
Och, ogon -n +43 to zmieniacz gier! Użyłem niezręcznej inwokacji sed dla tego samego efektu.
pfctdayelise
4
Co zrobić, jeśli nie masz już miejsca na urządzeniu? sed -i 1,50000000d 17GigFiletworzy plik tymczasowy, sedXYZktóry zużywa o wiele więcej gigabajtów. Czy istnieje podejście bez plików tymczasowych?
juanmf
Jaka jest różnica między tail -n +43i head -n 44jak wspomniano w pytaniu?
Hashim
@juanmf Możesz to zrobić za pomocą narzędzia GUI (zrobiłem to za pomocą podkładki pod mysz, ale interesujący plik był „tylko” ~ 700 MB. Jednak ładowanie pliku zajmuje trochę czasu…
Digger
18

To wydaje się najłatwiejsze:

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

Usuń wiersze 1-42 z test.sql i zapisz jako test2.sql

Kohjah Breese
źródło
9
krótszy to sed -i '1,42d' test.sql, jeśli nie musisz zachowywać oryginalnego pliku.
Sadi
10

Spróbuj tego,

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

ptantiku
źródło
3

Możesz używać Vima w trybie Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 przejdź do pierwszej linii

  2. 42 wybierz 42 linie

  3. d usunąć

  4. x Zapisz i zamknij

Steven Penny
źródło
1
Czy tworzy plik tymczasowy? Czy można to zrobić, gdy miejsce na urządzeniu jest mniejsze niż rozmiar pliku?
juanmf
2
@juanmf Wszystkie te rozwiązania wymagają pliku tymczasowego. Możliwe jest jedynie usunięcie danych z końca pliku bez użycia pliku tymczasowego.
PerlDuck,
0

Niestety nie mogę teraz podać rzeczywistego kodu. Spróbuj jednak spojrzeć na coś w stylu

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

To, co należy zrobić (po prawidłowym sformatowaniu), to policzyć liczbę wierszy w pliku (wc -l), odjąć od niego 44 (-44), a następnie wydrukować wszystko, zaczynając od 45-tej linii w pliku.

Mam nadzieję, że to pomoże i powodzenia.

kb2bcg
źródło
Nie jest to do końca optymalne, wc -lponieważ wywołujesz plik, przetwarzasz go dwukrotnie, podczas gdy sedlub tailprzetwarzasz go tylko raz.
jo
0

Spróbuj tego,

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

lub,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new
souravc
źródło
0

Po prostu to dodaj. Jeśli używasz komputera Mac, musisz dodać rozszerzenie kopii zapasowej. Odpowiedź z tego postu .

sed -i '.bak' 1,42d dump.sql
Jerinaw
źródło
0

Z powodu sedrozbieżności w systemach Linux i Mac postanowiłem użyć tail -n +43 dump.sql > dump.sqlformatu.

Akash Agarwal
źródło