Hallo Ich habe etwa 3.000 einzelne Textdateien, jede davon ca. 5MB groß. Die Textdateien enthalten jeweils eine Vielzahl von etwa 50Zeichen langen Zeilen Ich möchte sie nun: - alle zu einer großen Datei zusammenfügen - Zeilenweise sortieren - gleiche Zeilen entfernen Wie stelle ich sowas an? Ich habe bereits Ultraedit veruscht (bringt Fehlermeldung seek error) und EmEditor (sortiert bis die internen 16GB Ram voll sind und kommt dann nicht mehr oder kaum noch weiter)
> [..] 3.000 einzelne Textdateien [..] > cat file1 file2 ... fileN | sort | uniq ..und falls bei 3000 Dateien die maximale Pufferlänge überschritten wird: $ find /source/of/stuff/ -type f -print0 | xargs -0 cat | sort | uniq
Wenn du viel RAM hast, alles in einem Rutsch:
1 | sort -u *.txt >out.txt |
Sparsamer: jedes File sortieren und dann mergen:
1 | for i in *.txt; do sort -u "$i" >"$i.sorted"; done |
2 | sort -m -u *.sorted >out.txt |
(Nur runtergetippt, nicht getestet)
Lord Hesketh-Fortescue aus North Cothelstone Hall schrieb im Beitrag
#5748506:
> cat file1 file2 ... fileN | sort | uniq
Da wir die Anwort wohl "line too long" sein.
Aber im Prinzip, ja - mit "find ... | xargs ..." erweitern geht.
leo
Flodder schrieb: > - Zeilenweise sortieren Nach welcher Metrik überhaupt? Flodder schrieb: > - gleiche Zeilen entfernen Muss denn Unicode unterstützt werden, oder reicht ASCII?
Jemand schrieb: >> - gleiche Zeilen entfernen > > Muss denn Unicode unterstützt werden, oder reicht ASCII? Deutest du "unicode normalization" an? Bewahr den TO vor solchen Komplikationen ;-) Ich sag nur "µ" vs. "μ". leo
leo schrieb: > Ich sag nur "µ" vs. "μ". Ha, und schon haben wir den Salat. Ich schrieb ca. U+00B5 vs. U+03BC also mikro vs. mue. leo
leo schrieb: > Jemand schrieb: >>> - gleiche Zeilen entfernen >> >> Muss denn Unicode unterstützt werden, oder reicht ASCII? > > Deutest du "unicode normalization" an? > Bewahr den TO vor solchen Komplikationen ;-) > > Ich sag nur "µ" vs. "μ". > > leo Ist ja langweilig, wenn Arabisch oder Hebräisch dazukommt, dann wird es erst richtig lustig. ;)
foobar schrieb: > Sparsamer: jedes File sortieren und dann mergen: > for i in *.txt; do sort -u "$i" >"$i.sorted"; done > sort -m -u *.sorted >out.txt > > (Nur runtergetippt, nicht getestet) Dein Vorschlag gefällt mir sehr gut, vor allem für Rechner mit schwacher RAM-Ausstattung. Ich habe ihn mal auf meinem Rechner mit 6GB RAM ausprobiert: Dazu habe ich 3000 Dateien mit je 100000 Zeilen mit je 50 zufälligen Ziffern generiert. sort verarbeitet im Merge-Modus defaultmäßig nur bis zu 16 Eingabedateien gleichzeitig, bei einer größeren Anzahl werden sie in 16er-Gruppen in Temporärdateien gemerget, und das so lange, bis am Ende nur noch eine einzelne Datei übrig bleibt. Die Temporärdateien haben erst einmal mein /tmp-Verzeichni (RAM-Disk mit 2,9G) gesprengt. Man kann das Limit mit --batch-size von 16 auf 3000 erhöhen, stößt dann aber auf ein weiteres Limit von 1024 Dateien pro Prozess. Dieses kann man mit prlimit ebenfalls erhöhen, so dass der Befehl für das Mergen ohne Temporärdateien so lautet:
1 | prlimit -n3003 sort -mu --batch-size=3000 *.sorted > out.txt |
Beides zusammen (Sortieren der 3000 Einzeldateien und Mergen) hat bei mir auf einer mechanischen Festplatte eine knappe halbe Stunde gedauert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.