Kleine Skript-Aufgabe für ASCII-Files

Tronar

aus Überzeugung altmodisch
Ich habe hier eine ziemlich einfache Aufgabe, aber mir fallen nur sehr umständliche Lösungen ein. Kann einer von Euch das elegant mit sed oder perl oder so?

Ich habe eine größere Zahl von ASCII-Files, man könnte sagen, Log-Files. Sie bestehen aus "Events" unterschiedlicher Länge, wobei die ersten vier Buchstaben der ersten Zeile jedes Events "UQMD" lauten. Weil das erzeugende Programm plötzlich abgebrochen wurde, ist in fast allen Files das letzte Event unvollständig. Wie kann ich das aus allen Files automatisiert löschen, also alle Zeilen ab dem letzten Auftreten von "UQMD" am Zeilenanfang bis Dateiende?

Ergänzende Informationen: Dateigröße typisch 50 MB, jeweils typisch 1000 Zeilen pro Event, Zeilenlänge < 200 Zeichen. Es wäre auch okay, die beschnittenen Dateien gleich in eine einzige große Datei zusammenzufassen, die dann ein paar GB groß wäre.
 
Very quick and dirty mit Linux-Tools unter Bash unter der Annahme, dass du die tools "head", "tail", "cut", "expr" und "grep" hast :)

Code:
head -n $(expr $(grep -n UQMD test.txt | tail -1 | cut -d ':' -f1) - 1) test.txt

Nimm vielleicht erstmal eine Test-Datei.
Wenn du das regelmäßig brauchst, wäre vielleicht ein kleines python-Programm die bessere Lösung.
Gruß
Markus
 
Prima, das ist richtig elegant, keineswegs dirty. Kleiner Pferdefuß ist vielleicht, daß die Datei zweimal gelesen wird, aber das bringt keine nennenswerte Verzögerung.
Mir schwebte so etwas vor wie ein ganzes Event in einem Pufferspeicher abzulegen und erst dann rauszuschreiben, wenn die nächste "UQMD"-Zeile gelesen wird. Das ist mit Shell sehr unbequem, mit Perl würde es schon gehen, Python kann ich nicht. "sed" wäre natürlich eine Gaudi, das würde ich zu gern sehen. :D
Deine Lösung reicht mir vollauf, danke!
 
Freut mich :) - Quick'n dirty hab ich auch nur gesagt, weil der von dir angesprochene Pferdefuß noch drin ist...

Gruß
Markus
 
Zurück
Oben