Jak usunąć zduplikowane linie w dużym pliku tekstowym o rozmiarze wielu GB?


16

Moje pytanie jest podobne do tego pytania, ale ma kilka różnych ograniczeń:

  • Mam dużą \nograniczoną listę słów - jedno słowo w wierszu. Rozmiar plików wynosi od 2 GB do nawet 10 GB.
  • Muszę usunąć wszelkie zduplikowane linie.
  • Proces może sortować listę podczas usuwania duplikatów, ale nie jest to wymagane.
  • Na partycji jest wystarczająca ilość miejsca, aby pomieścić nową unikalną listę słów.

Próbowałem obu tych metod, ale oba kończą się błędami braku pamięci.

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)

Jakie inne podejścia mogę wypróbować?


Zobacz rozwiązanie wykorzystujące awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Odpowiedzi:


18

Spróbuj użyć sortowania z opcją -o/ --output=FILEzamiast przekierowywać dane wyjściowe. Możesz także spróbować ustawić za buffer-sizepomocą -S/ --buffer-size=SIZE. Spróbuj także -s/ --stable. I przeczytaj stronę podręcznika, zawiera wszystkie informacje, które podałem.

Pełne polecenie, którego możesz użyć, które może działać w przypadku tego, co robisz:

sort -us -o wordlist_unique.lst wordlist.lst

Możesz także przeczytać następujący adres URL:

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

To dokładniej wyjaśnia rodzaj niż stronę podręcznika.


dzięki za sugestię, niestety użycie opcji --output nadal nie naprawia błędu braku pamięci. Bieganie, które wciąż mi daje sort: write failed: /root/tmp/sortVxscLn: No space left on device. Problem jest trochę denerwujący, ponieważ nie zawodzi od razu. Wygląda na to, że musisz poczekać na wyczerpanie się pamięci, zanim wystąpi błąd.
greatwolf

8
@Victor T .: To nie jest błąd braku pamięci, ale błąd braku miejsca na dysku. Czy / root ma inny system plików niż twoje dane? Jeśli tak, użyj opcji -T / - katalog tymczasowy, sortaby użyć systemu plików z większą ilością wolnego miejsca.
camh

@camh dzięki, że załatwiło sprawę. Nie zdawałem sobie sprawy, że możesz określić, jakiego bufora pośredniego użyć.
greatwolf
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.