Как удалить повторяющиеся строки в большом текстовом файле размером в несколько ГБ?

16

Мой вопрос похож на этот вопрос, но имеет несколько ограничений:

  • У меня большой список \nслов с разделителями - по одному слову в строке. Размер файлов варьируется от 2 ГБ до 10 ГБ.
  • Мне нужно удалить любые дубликаты строк.
  • Процесс может сортировать список в процессе удаления дубликатов, но не обязателен.
  • В разделе достаточно места для хранения нового уникального выведенного списка слов.

Я попробовал оба этих метода, но они оба терпят неудачу с ошибками нехватки памяти.

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)

Какие еще подходы я могу попробовать?

greatwolf
источник
Посмотрите на решение, используя awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Ответы:

18

Попробуйте использовать сортировку с параметром -o/ --output=FILEвместо перенаправления вывода. Вы также можете попробовать установить buffer-sizeс помощью -S/ --buffer-size=SIZE. Также попробуйте -s/ --stable. И прочитайте справочную страницу, она предлагает всю информацию, которую я дал.

Полная команда, которую вы можете использовать, может работать на то, что вы делаете:

sort -us -o wordlist_unique.lst wordlist.lst

Вы также можете прочитать следующий URL:

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

Это более подробно объясняет сортировку, чем справочная страница.

laebshade
источник
спасибо за предложение, к сожалению, использование --output все еще не исправляет ошибку нехватки памяти. Запуск, который все еще дает мне sort: write failed: /root/tmp/sortVxscLn: No space left on device. Проблема немного раздражает тем, что она не сразу перестает работать. Похоже, вам нужно подождать, пока память не будет исчерпана, прежде чем произойдет ошибка.
великий волк
8
@Victor T .: Это не ошибка нехватки памяти, а ошибка нехватки места на диске. Находится ли / root в другой файловой системе с вашими данными? Если это так, используйте параметр -T / - временный каталог, sortчтобы использовать файловую систему с большим количеством свободного места.
Camh
@camh спасибо, что сделали свое дело. Не знал, что вы можете указать, какой промежуточный буфер использовать.
великий волк