Entfernen Sie die ersten n Zeilen einer großen Textdatei

63

Ich muss die ersten 42 Zeilen eines 2-GB-SQL-Dumps entfernen.

Ich weiß, dass ich die ersten Zeilen anzeigen kann mit:

head -n 44 dump.sql

Aber gibt es trotzdem die Möglichkeit, sie zu bearbeiten oder zu entfernen?

Kohjah Breese
quelle

Antworten:

91

Wenn Sie nur die Zeilen ab dem 43. anzeigen möchten, können Sie verwenden

tail -n +43 dump.sql

Das +Zeichen ist wichtig - ohne es tailwerden stattdessen die letzten 43 Zeilen gedruckt . Alternativ mit 'sed'

sed 1,42d dump.sql

Wenn Sie die ersten 42 Zeilen der Originaldatei wirklich löschen möchten, können Sie die Änderung mit der -iOption vornehmen

sed -i 1,42d dump.sql
Stahlfahrer
quelle
Fantastische Antwort, fantastische Verwendung von tail. Ich habe viele Male etwas Neues gefunden, um aus Ihren Antworten zu lernen. Vielen Dank.
Souravc
1
Oh man tail -n +43 ist ein Game Changer! Ich habe eine umständliche Aufforderung von sed verwendet, um denselben Effekt zu erzielen.
Pfctdayelise
4
Was ist, wenn auf dem Gerät kein Speicherplatz mehr vorhanden ist? sed -i 1,50000000d 17GigFileErstellt eine temporäre Datei sedXYZ, die viel mehr Gigabyte verbraucht. Gibt es einen Ansatz ohne temporäre Dateien?
Juanmf
Was ist der Unterschied zwischen tail -n +43und head -n 44wie in der Frage erwähnt?
Hashim
@juanmf Sie könnten versuchen, dies mit einem GUI-Tool zu tun (ich habe es mit Mousepad gemacht, aber die Datei von Interesse war "nur" ~ 700 MB. Es dauert eine Weile, bis die Datei geladen ist ...
Digger
18

Dies scheint am einfachsten zu sein:

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

Entfernen Sie die Zeilen 1-42 aus test.sql und speichern Sie sie als test2.sql

Kohjah Breese
quelle
9
Ein kürzeres wäre sed -i '1,42d' test.sql, wenn Sie die Originaldatei nicht behalten müssen.
Sadi
10

Versuche dies,

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

ptantiku
quelle
3

Sie können Vim im Ex-Modus verwenden:

ex -s -c '1d42|x' dump.sql
  1. 1 in die erste Zeile gehen

  2. 42 Wähle 42 Zeilen aus

  3. d löschen

  4. x speichern und schließen

Steven Penny
quelle
1
Erstellt es eine temporäre Datei? Ist dies möglich, wenn der auf dem Gerät verbleibende Speicherplatz kleiner als die Dateigröße ist?
Juanmf
2
@ juanmf Für alle diese Lösungen ist eine temporäre Datei erforderlich. Es ist nur möglich, Daten vom Ende einer Datei zu entfernen, ohne eine temporäre Datei zu verwenden.
PerlDuck
0

Entschuldigung, ich kann Ihnen momentan keinen aktuellen Code geben. Versuchen Sie jedoch, etwas in der Richtung von zu betrachten

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

Was dies tun sollte (einmal richtig formatiert), ist die Anzahl der Zeilen in der Datei zu zählen (wc -l), 44 davon zu subtrahieren (-44) und dann alles beginnend mit der 45. Zeile in der Datei auszudrucken.

Hoffe das hilft und viel Glück.

kb2bcg
quelle
Das ist nicht ganz optimal, Aufruf wc -lauf der Datei, können Sie sie zweimal verarbeiten, während sedoder tailerst einmal verarbeiten.
Du
0

Versuche dies,

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

oder,

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

Nur um dies hinzuzufügen. Wenn Sie einen Mac verwenden, müssen Sie die Backup-Erweiterung hinzufügen. Antwort von diesem Beitrag .

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

Aufgrund von sedUnstimmigkeiten zwischen Linux und Mac habe ich beschlossen, das tail -n +43 dump.sql > dump.sqlFormat zu verwenden .

Akash Agarwal
quelle