große Textdatei per Script bereinigen
große Textdatei per Script bereinigen
Hallo Forum,
ich habe mehrere große Textdateien (mehrere X-Tausend Zeilen pro Datei) welche ich von unsäglichen Leerzeilen bereinigen muss. Wie stelle ich das am geschicktesten an?
MfG,
teal
ich habe mehrere große Textdateien (mehrere X-Tausend Zeilen pro Datei) welche ich von unsäglichen Leerzeilen bereinigen muss. Wie stelle ich das am geschicktesten an?
MfG,
teal
Re: große Textdatei per Script bereinigen
Kann dir zwar nicht sagen, ob es performant ist, aber mir fällt da nur perl oder sed ein.
Oh, yeah!
Re: große Textdatei per Script bereinigen
Die Performace ist eigentlich egal. Das Problem ist, ich kenne mich weder in perl noch in sed aus. Hinzu kommt noch, dass ich "einzelne" Leerzeilen beibehalten möchte, nur wenn beispielsweise Zwei, drei oder Xbeliebige Leerzeilen hintereinander folgen möchte ich alle Leerzeilen bis auf die erste löschen.
Ich suche gerade was im Netz rum, ohne Perl Wissen stoße ich hier allerdings nicht wirklich tief vor...
Ich suche gerade was im Netz rum, ohne Perl Wissen stoße ich hier allerdings nicht wirklich tief vor...
format y: /FS:NTFS
Re: große Textdatei per Script bereinigen
Eine Möglichkeit ist
eine Andere mit sed und direkter Änderung der Datei
Bei mehreren Dateien schreib eine 'for... do' Schleife drumherum.
Code: Alles auswählen
cat -s datei.txt
Code: Alles auswählen
sed -i '/./,/^$/!d' datei.txt
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!
Macht ohne Haftung funktioniert nicht!
Re: große Textdatei per Script bereinigen
Da nicht jede Leerzeile sed -e '/^$/d' datei gelöscht werden soll, sondern nur weiter Leerzeilen, finde ich die Lösung von detix sehr gut und geschickt. Wäre ich so ohne weiteres nicht drauf gekommen.
Es wird nun alles von /./ = irgendetwas bis /^$/ Leerzeile nicht gelöscht !d.
Es wird nun alles von /./ = irgendetwas bis /^$/ Leerzeile nicht gelöscht !d.
Oh, yeah!
Re: große Textdatei per Script bereinigen
Das Ganze (beide varianten) haben leider nicht funktioniert.
Ich habe festgestellt, dass jede Zeile mindestens 4 Leerzeichen enthält. Sprich es sind keine Leerzeilen, da sie ja einen Inhalt haben. Kann man das irgendwie in sed anhängen?
Ich habe festgestellt, dass jede Zeile mindestens 4 Leerzeichen enthält. Sprich es sind keine Leerzeilen, da sie ja einen Inhalt haben. Kann man das irgendwie in sed anhängen?
format y: /FS:NTFS
-
- Beiträge: 3472
- Registriert: 30.11.2005 10:32:22
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Wald
Re: große Textdatei per Script bereinigen
Code: Alles auswählen
grep -v "^$" Datei
Re: große Textdatei per Script bereinigen
Dies entfernt alle Leerzeilen, aber sollten ja nur die darauffolgenden gelöscht werden. Wobei das auch nicht mehr stimmt, weil mit Leerzeilen nämlich Leerzeichen gemeint sindSpasswolf hat geschrieben:funktioniert hier.Code: Alles auswählen
grep -v "^$" Datei
Oh, yeah!
Re: große Textdatei per Script bereinigen
Habe es mal so probiert. So wird allerdings noch nichts in der original DAtei geändert. Dazu müsstest du dann den Schalter -i verwenden.
ABer zum Prüfen sollte es OK sein.
ABer zum Prüfen sollte es OK sein.
Code: Alles auswählen
daniel@daniel-laptop:/tmp$ sed -n 's/\s\{2,\}/ /g;p' test
Zeil 1 gefolgt von... nur ein oder mehre
Leerzeile Leerzeile
noch weitere Leerzeilen
mit Zeilenumbruch und
Ende.
daniel@daniel-laptop:/tmp$ cat test
Zeil 1 gefolgt von... nur ein oder mehre
Leerzeile Leerzeile
noch weitere Leerzeilen
mit Zeilenumbruch und
Ende.
Oh, yeah!
Re: große Textdatei per Script bereinigen
Code: Alles auswählen
# Ich verwende da immer Python, paste das ganze in ein file.py, und rufe das ganze mit python file.py auf
# ohne argumente wird dieses file selbst als Testfile hergenommen, kannst aber auch ein oder mehrere
# Files als Argumente uebergeben, allerdings geht das Ergebnis aufs Terminal.
# Leerzeilen _und_ Leerzeichen muessen hier beachtet werden.
import sys
for arg in sys.argv:
blank=False
for line in open(arg):
len = line.strip()
if len:
print line,
blank = False
else:
if blank == False:
print line,
blank = True
Re: große Textdatei per Script bereinigen
teal, wenn sonst keine Überraschungen mehr kommen
probiers auch mal damit
probiers auch mal damit
Code: Alles auswählen
sed -i 's/^ *$//;/./,/^$/!d' datei.txt
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!
Macht ohne Haftung funktioniert nicht!
Re: große Textdatei per Script bereinigen
prima, das ist eindeutig kürzer.
Es ist zwar nicht so gut lesbar und verarbeitet noch keine Tabs,
aber das lässt sich sicher auch noch verbessern.
Es ist zwar nicht so gut lesbar und verarbeitet noch keine Tabs,
aber das lässt sich sicher auch noch verbessern.
Re: große Textdatei per Script bereinigen
Also das Beispiel von dir detix, funktioniert bei mir nicht.
Die Beispiel-Datei mit den Leerzeichen sieht so aus:
Und die sed-Bearbeitung:
Die Beispiel-Datei mit den Leerzeichen sieht so aus:
Code: Alles auswählen
daniel@daniel-laptop:/tmp$ cat test
zeil 1 gefolgt von... nur ein oder mehre
Leerzeile Leerzeile
noch weitere Leerzeilen
mit Zeilenumbruch und
Ende. ABC DEF GH
Code: Alles auswählen
daniel@daniel-laptop:/tmp$ sed -e 's/^ *$//;/./,/^$/!d' test
zeil 1 gefolgt von... nur ein oder mehre
Leerzeile Leerzeile
noch weitere Leerzeilen
mit Zeilenumbruch und
Ende. ABC DEF GH
daniel@daniel-laptop:/tmp$ sed -n 's/\s\{2,\}/ /g;p' test
zeil 1 gefolgt von... nur ein oder mehre
Leerzeile Leerzeile
noch weitere Leerzeilen
mit Zeilenumbruch und
Ende. ABC DEF GH
Oh, yeah!
Re: große Textdatei per Script bereinigen
resi, für tabs könnte das reichen, nicht getestet
Duff, ich hab die Nachfrage so verstanden,
das es bei ihm Zeilen gibt, die NUR Leerzeichen beinhalten und er nicht
2 oder mehr aufeinanderfolgende Leerzeichen durch eines ersetzen will,
mal abwarten...
Code: Alles auswählen
sed -i 's/^[ t]*$//;/./,/^$/!d' datei.txt
das es bei ihm Zeilen gibt, die NUR Leerzeichen beinhalten und er nicht
2 oder mehr aufeinanderfolgende Leerzeichen durch eines ersetzen will,
mal abwarten...
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!
Macht ohne Haftung funktioniert nicht!
Re: große Textdatei per Script bereinigen
Ist auf jeden Fall lustig, da jeder eine andere Definition verstanden hat
Oh, yeah!
Re: große Textdatei per Script bereinigen
eher so
habs aber auch nicht getestet
Code: Alles auswählen
sed -i 's/^[ \t]*$//;/./,/^$/!d' datei.txt
Re: große Textdatei per Script bereinigen
Hi resi,
kannst du dazu mal was sagen, irgendwie komme ich wenn ich mir ueberlege wie das Script arbeitet nie bis zum ende durch.resi hat geschrieben:Code: Alles auswählen
sed -i 's/^[ \t]*$//;/./,/^$/!d' datei.txt
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
Re: große Textdatei per Script bereinigen
Eigentlich ist es ja detixs Vorschlag (von weiter oben).roli hat geschrieben:kannst du dazu mal was sagen, irgendwie komme ich wenn ich mir ueberlege wie das Script arbeitet nie bis zum ende durch.resi hat geschrieben:Code: Alles auswählen
sed -i 's/^[ \t]*$//;/./,/^$/!d' datei.txt
Ich habe im Dezember, als das Thema erstmals aktuell war, auch schon rumgerätselt wie detixs Vorschlag funktioniert, habe ihn dann aber einfach so hingenommen. (Hatte wenig Zeit.) Jetzt kommt es sehr gelegen wieder einzusteigen ... und durchzusteigen
Ich vereinfache den Aufruf mal zu:
Code: Alles auswählen
sed -i '/./,/^[ \t]*$/!d' datei.txt
Diese Anweisung bedeutet im Klartext:
Der `d' Befehl (= Zeile löschen) soll _nicht_ ausgeführt werde für die angegebenen Bereiche.
Die Bereiche zu verstehen ist etwas kompliziert, wie ich gerade gemerkt habe. Es ist so, dass das Kommando aktiviert wird, wenn die aktuelle Zeile auf die erste Adresse (/./) passt und deaktiviert wird, wenn sie auf die zweite (/^[ \t]*$/) passt.
Wenn man die Negierung noch auflöst, bedeutet es, dass das Kommando (`d' = aktuelle Zeile löschen) ausgeführt für alle Zeilen die nach einer leeren (oder nur-Whitespace) Zeile folgen bis zur jeweils nächsten nicht-leeren Zeile. Also alle auf die erste leere Zeile folgenden leeren Zeilen.
Da Negierungen schwer verständlich sind, habe ich das sed-Script mal umformuliert:
Code: Alles auswählen
sed -n '/./,/^[ \t]*$/p' datei.txt
Es scheint dies wäre die beste sed-Lösung.
Am einfachsten verständlich ist aber wohl:
Code: Alles auswählen
sed 's/^[ \t]*$//' datei.txt | cat -s
EDIT:
Geholfen hat mir übrigens, wie schon so viele Male, das Büchlein ``SED & AWK'' von Stephan Thesing von mitp ge-packt.
Use ed once in a while!
Re: große Textdatei per Script bereinigen
Hi,
Ups, trotzdem danke.Meillo hat geschrieben:Eigentlich ist es ja detixs Vorschlag (von weiter oben).
Das Komma hat mich immer wieder raus gebracht ...Meillo hat geschrieben:Die Bereiche zu verstehen ist etwas kompliziert, wie ich gerade gemerkt habe. Es ist so, dass das Kommando aktiviert wird, wenn die aktuelle Zeile auf die erste Adresse (/./) passt und deaktiviert wird, wenn sie auf die zweite (/^[ \t]*$/) passt.
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"