Entferne die ersten N Zeilen einer Datei in der Unix-Befehlszeile

8

Ich versuche die ersten 37 Zeilen aus einer sehr, sehr großen Datei zu entfernen. Ich fing an, sed und awk zu versuchen, aber sie scheinen die Daten in eine neue Datei kopieren zu müssen. Ich bin auf der Suche nach einer "Zeilen entfernen" -Methode, die im Gegensatz zu sed -i keine Kopien erstellt, sondern nur Zeilen aus der vorhandenen Datei entfernt.

Folgendes habe ich getan ...

%Vor%

Beide scheinen eine vollständige Kopie zu machen. Gibt es eine andere einfache CLI, die dies ohne eine vollständige Dokumentenübergabe schnell tun kann?

    
Mittenchops 26.06.2013, 20:49
quelle

4 Antworten

10

Es gibt keine einfache Möglichkeit, Inplace-Editing mit UNIX-Dienstprogrammen durchzuführen, aber hier ist eine Inplace-Dateimodifikationslösung, die Sie vielleicht modifizieren können, um für Sie zu arbeiten (mit freundlicher Genehmigung von Robert Bonomi bei Einstellungen ):

%Vor%

Die letzte Datei sollte $count bytes kleiner als das Original sein (da das Ziel darin bestand, $count bytes vom Anfang zu entfernen), also müssen wir die letzten $count bytes entfernen. Auf einem GNU-System wie Linux kann dies erreicht werden durch:

%Vor%

Siehe den Google Groups-Thread, auf den ich für andere Vorschläge und Informationen verwiesen habe.

    
Ed Morton 26.06.2013, 21:57
quelle
6

Die Semantik von Unix-Dateien erlaubt es nicht, den vorderen Teil einer Datei abzuschneiden.

Alle Lösungen basieren entweder auf:

  1. Lesen Sie die Datei in den Speicher und schreiben Sie sie dann zurück ( ed , ex , andere Editoren). Dies sollte in Ordnung sein, wenn Ihre Datei & lt; 1 GB ist oder wenn Sie viel RAM haben.
  2. Eine zweite Kopie schreiben und optional das Original ersetzen ( sed -i , awk / tail > foo ). Das ist in Ordnung, solange Sie genügend freien Speicherplatz für eine Kopie haben und die Wartezeit nicht auslassen.

Wenn die Datei zu groß ist, als dass eine Datei für Sie funktionieren könnte, können Sie sie möglicherweise umgehen, je nachdem, was Ihre Datei liest.

Vielleicht überspringt Ihr Leser Kommentare oder Leerzeilen? Wenn dies der Fall ist, können Sie eine Nachricht erstellen, die der Leser ignoriert, sicherstellen, dass sie dieselbe Anzahl an Bytes wie die ersten 37 Zeilen in Ihrer Datei hat, und den Anfang der Datei mit dd if=yourdata of=file conv=notrunc überschreiben.

    
that other guy 26.06.2013 21:15
quelle
4

ist der Standardeditor:

%Vor%     
gniourf_gniourf 26.06.2013 20:57
quelle
2

Die Kopie muss irgendwann erstellt werden - warum nicht zum Zeitpunkt des Lesens der "modifizierten" Datei; die veränderte Kopie streamen anstatt sie zu speichern?

Was ich denke - erstellen Sie eine Named Pipe "file2", die die Ausgabe derselben awk 'NR & gt; 37 'file.xml oder was auch immer; wer dann file2 liest, sieht die ersten 37 Zeilen nicht.

Der Nachteil ist, dass es jedes Mal, wenn die Datei verarbeitet wird, awk ausführt, also ist es nur machbar, wenn es selten gelesen wird.

    
Peteris 26.06.2013 21:19
quelle