Удаление дубликатов в большом текстовом списке

Я искал в Интернете и stackexchange для этого. Хотя есть много похожих тем, я пока не нашел решения.

Итак, у меня довольно большой список (около 20 ГБ), который содержит около 5% дублированных строк. Я хочу отфильтровать этот список, так как один из дубликатов будет удален. Пример:

Входные данные:

test123 Test123 test test123 test 123 

Вывод:

 test123 Test123 test test 123 

Независимо от того, сортируется ли список или нет, не имеет значения.

Я пробовал sort -u -o output.txt , также sort -us -o output.txt . Он отлично работает для небольших файлов, но когда я пытаюсь делать файлы более чем ок. 4 ГБ, результирующий файл подозрительно мал и вместо файла .txt он, по-видимому, стал «emacs-lisp-source-text».

Я был бы очень благодарен, если бы кто-нибудь мог мне помочь!

2 Solutions collect form web for “Удаление дубликатов в большом текстовом списке”

Протестировав с помощью GNU sort из GNU coreutils 8.26, у меня не было проблем с сортировкой файла 5GiB. Итак, вы можете попробовать установить этот.

Следует иметь в виду:

  • sort -u не дает вам уникальных строк, но одна из всех строк, сортирующих их. В системах GNU, особенно в типичной локали, существует несколько символов, которые сортируют одинаково. Если вам нужны уникальные строки на уровне байта, используйте LC_ALL=C sort -u .
  • sort использует временные файлы для больших входов для сортировки в кусках, чтобы не использовать всю память. Если у вас недостаточно места во временном каталоге (обычно /tmp если вы не задали $TMPDIR ), тогда он будет терпеть неудачу. Установите $TMPDIR (см. Также опцию -T с sort GNU) в каталог с достаточно свободным пространством.
 printf ""> OutputFile
 cat InputFile | 
 в то время как IFS = read -r line;  делать 
   если [ !  -z "$ line"];  тогда
     если !  grep -Fxqe "$ line" OutputFile;  тогда
       echo "$ line" >> OutputFile;
     фи
   фи
 сделанный

объяснение

Создать новый выходной файл
printf "">OutputFile

Труба InputFile в цикл while
cat InputFile |

Прочитайте каждую строку
while IFS= read -r line; do

Обрабатывать пустые строки
if [ ! -z "$line" ]; then

Проверьте, нет ли строки в OutputFile
Если результаты пустые, это еще не в OutputFile (т. Е. Уникально)
if ! grep -Fxqe "$line" OutputFile; then

Поместите строку в OutputFile
echo "$line">>OutputFile;

  • Как создать скрипт с обратным действием
  • uniq a csv файл, игнорирующий столбец, возможно, awk?
  • Выберите наиболее подходящее имя файла
  • Как изменить сортировку результата из grep -rc
  • Есть ли способ сортировать grep-вывод csv-файла?
  • Как найти наиболее распространенное имя в файле passwd
  • Добавить слова в список слов с помощью sort -u avoinding duplicata
  • Переупорядочение файла на основе второго файла
  • Сортировка вывода awk за исключением первой строки?
  • Сортировка с неравными пробелами в первом столбце
  • Как получить сортировку unix для сортировки в том же порядке, что и Java (по значению unicode)
  • Interesting Posts

    Как проверить, существует ли приложение в $ PATH?

    Google хост становится недоступным после пинга 10-12 раз

    Скажите dhclient, чтобы не использовать интерфейс

    Связывание имени модуля lsmod с вводом меню конфигурации ядра

    Linux – время изменения файла и время модификации

    Реализация симметричной NAT с дополнительным портом источника? (программное обеспечение / ОС или аппаратный маршрутизатор)

    Запомнить пароль после `sudo -i`

    Принудите X использовать вторую видеокарту, чтобы я мог пройти первую карту до XEN VM?

    Как работает «экран»?

    Как показывать таблицы на страницах Man, преобразованных в html?

    Объясните синтаксис

    Невозможно grep список заданий, когда задания, вызванные функцией

    Как получить nth до n + ath байт по всем строкам, формируя текстовый файл в * nix?

    Как я могу получить информацию в реальном времени о подключении монитора / отключении от сети?

    Сценарий оболочки для поиска и замены значения из файла csv

    Linux и Unix - лучшая ОС в мире.