große Textdateien bearbeiten

Gast #5748498
Lesenswert?

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)
Gast #5748514
Lesenswert?

> [..] 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
Gast #5748516
Lesenswert?

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)
Gast #5748519
Lesenswert?

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
Gast #5748574
Lesenswert?

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. ;)
Moderator #5749455
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren