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?


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.