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?

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

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


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


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


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.


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

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

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.