Ich habe Dateien, die von einem Programm generiert wurden, das keine Zeilenumbrüche am Ende von Datensätzen gesetzt hat. Ich möchte Zeilenumbrüche zwischen die Datensätze setzen, und ich kann dies mit einem einfachen sed-Skript tun:
sed -e 's/}{/}\n{/g'
Das Problem ist, dass die Eingabedateien mehrere Gigabyte groß sind und daher die zu sedierenden Eingabezeilen mehrere GB lang sind. sed versucht, eine Zeile im Speicher zu halten, was in diesem Fall nicht funktioniert. Ich habe die --unbuffered
Option ausprobiert , aber das schien sie nur langsamer zu machen und erlaubte nicht, dass sie richtig beendet wurde.
tr
zu übersetzen}
in\n
und verwenden Sie dannsed
ein hinzuzufügen}
jede Zeile am Ende? So:tr '}' '\n' < your_file.txt| sed 's/$/}/'
printf "\n" >> file
}{
Wiederholung, bis sie mehrere Gigabyte lang ist, ausreichen würde.dd if=file cbs=80 conv=unblock
würde es das tun - aber es ist selten so einfach.Antworten:
Sie können ein anderes Tool verwenden, mit dem Sie das Trennzeichen für Eingabedatensätze festlegen können. Zum Beispiel
Perl
Die spezielle Variable
$/
ist das Trennzeichen für Eingabedatensätze. Wenn Sie}{
festlegen, dass Zeilen als endend in definiert werden}{
. Auf diese Weise können Sie erreichen, was Sie wollen, ohne das Ganze in Erinnerung zu behalten.mawk oder gawk
Das ist die gleiche Idee. Setzt
RS="}{"
das Datensatztrennzeichen auf}{
und druckt dann}
eine neue Zeile{
(mit Ausnahme des ersten Datensatzes) und den aktuellen Datensatz.quelle
Perl zur Rettung:
Bei Einstellung
$/
auf\1024
wird die Datei in Blöcken von 1024 Byte gelesen. Die$closing
Variable behandelt den Fall, wenn ein Block endet}
und der nächste mit beginnt{
.quelle
Du solltest tun:
Es ist wahrscheinlich die effizienteste Lösung.
Dadurch
{}
werden mögliche nachfolgende Daten geschützt. Mit einem weiterentr
Vorgang können Sie dies vertauschen und am Anfang des ersten{
Feldes eine Leerzeile einfügen. Mögen...Das erste mit Dons Beispieldaten lautet also:
... und der zweite tut ...
Für das zweite Beispiel gibt es keinen nachgestellten Zeilenumbruch - für das erste jedoch einen.
quelle