Wie entferne ich doppelte Zeilen in einer großen Textdatei mit mehreren GB?

16

Meine Frage ist ähnlich zu dieser Frage, aber mit ein paar verschiedenen Einschränkungen:

  • Ich habe eine große \nWortliste mit Trennzeichen - ein Wort pro Zeile. Die Dateigröße reicht von 2 GB bis zu 10 GB.
  • Ich muss alle doppelten Zeilen entfernen.
  • Der Prozess kann die Liste während des Entfernens der Duplikate sortieren, ist jedoch nicht erforderlich.
  • Auf der Partition ist genügend Platz, um die neu ausgegebene eindeutige Wortliste aufzunehmen.

Ich habe beide Methoden ausprobiert, aber beide scheitern mit Fehlern aufgrund von Speichermangel.

sort -u wordlist.lst > wordlist_unique.lst
awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst
awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory)

Welche anderen Ansätze kann ich versuchen?

Großwolf
quelle
Schauen Sie sich eine Lösung mit awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Antworten:

18

Versuchen Sie, sort mit der Option -o/ zu verwenden, --output=FILEanstatt die Ausgabe umzuleiten. Sie können auch versuchen, das buffer-sizemit -S/ einzustellen --buffer-size=SIZE. Versuchen Sie auch -s/ --stable. Und lesen Sie die Manpage, die alle Informationen enthält, die ich gegeben habe.

Der vollständige Befehl, den Sie verwenden können, funktioniert möglicherweise für das, was Sie tun:

sort -us -o wordlist_unique.lst wordlist.lst

Möglicherweise möchten Sie auch die folgende URL lesen:

http://www.gnu.org/s/coreutils/manual/html_node/sort-invocation.html

Das erklärt sort genauer als die Manpage.

laebshade
quelle
danke für den vorschlag, leider behebt die verwendung von --output den out of memory fehler immer noch nicht. Laufen das gibt mir noch sort: write failed: /root/tmp/sortVxscLn: No space left on device. Das Problem ist insofern etwas ärgerlich, als es nicht sofort versagt. Es scheint, als müsste man warten, bis der Speicher erschöpft ist, bevor er fehlerhaft wird.
Urwolf
8
@ Victor T .: Das ist kein Fehler wegen zu wenig Speicherplatz, sondern wegen zu wenig Speicherplatz. Befindet sich / root auf einem anderen Dateisystem als Ihre Daten? Verwenden Sie in diesem Fall die Option -T / - Temporäres Verzeichnis sort, um ein Dateisystem mit mehr freiem Speicherplatz zu verwenden.
camh
@camh danke, das hat den Trick gemacht. Wusste nicht, dass Sie angeben können, welcher Zwischenpuffer verwendet werden soll.
Urwolf