Bearbeiten Sie die erste Zeile einer großen Textdatei

16

Ich habe eine riesige Textdatei, die viel zu groß ist, als dass das Ganze in den Speicher übertragen werden könnte. Alles, was ich mit dieser Textdatei tun muss, ist die erste Zeile zu bearbeiten (es ist eine CSV-Datei und ich muss die Titel ändern).

Gibt es eine einfache Möglichkeit, dies in Bash zu tun?

Lynks
quelle
Gibt es einen Grund, warum Sie nicht einfach einen Texteditor verwenden können?
dangph
Die Datei ist zu groß. Sie ist über 20 Mal größer als mein maximaler virtueller Speicher auf diesem Computer.
Lynks
1
Meinetwegen. Ich hatte den Eindruck, dass gute Texteditoren mit sehr großen Dateien umgehen können, da sie nur so viel laden, wie sie im Speicher benötigen, aber nach dem Lesen einiger anderer Fragen scheinen die meisten Probleme mit ihnen zu haben.
dangph
@dangph True ... mag seltsam sein, aber ein paar alte und veraltete "Texteditoren" (oder so genannte) wie edlinfür ms-dos oder edfür Unix schienen dieses Problem nicht zu haben, sondern nur Zeileneditoren ... RAM an Diese Zeiten waren selten und kostbar und eine Dateigröße in Gigabyte war etwas Unvorstellbares! ;)
laurent
Um die Dinge klar zu machen;): Ich vermisse es NICHT ed!!! aber es wäre eine gute passform in diesem fall (nicht sicher, ob es eine datei dieser größe handhaben könnte ...)
laurent

Antworten:

21

Mit können Sie lesssehen, was Sie bearbeiten möchten, und seddie Änderungen vornehmen. Auf diese Weise bearbeiten Sie, ohne die gesamte Datei zu laden.

Eine andere Möglichkeit besteht darin, die Datei zu teilen, zu bearbeiten und erneut zu verbinden:

split -b 10000k <file>

and to join:

cat xa* > <file>
laurent
quelle
upvote für sed.
Am
Fantastisch, split and join war genau das, wonach ich gesucht habe, danke.
Lynks
sed ist sicher besser, da es die ganze Datei leicht suchen / ersetzen kann, aber wenn er nur die erste Zeile ändern muss, ist split nicht schlecht und auch schneller.
Laurent
4
sed hätte Stunden gebraucht, um die gesamte Datei (knapp eine halbe TB) zu durchlaufen, die Änderungen befanden sich nur in der ersten Zeile, und es erscheint sinnvoll, sie abzuspalten.
Lynks
3

Wenn Ihre Änderung die Länge der Zeile ändert, muss die gesamte Datei neu geschrieben werden, siehe zum Beispiel diese Diskussion zu SO. Sie sollten wahrscheinlich in Betracht ziehen, die Daten in einer Datenbank zu speichern.

Unter Berücksichtigung dessen können Sie die Datei mit sed streamen und bearbeiten. So ersetzen Sie die erste Zeile (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Thor
quelle