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

Я искал в Интернете и 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;

  • Переупорядочение файла на основе второго файла
  • Сравните и распечатайте данные из разных текстовых файлов на один в Shell
  • Чтение каталога в сценарии оболочки
  • Сортировка ведет себя странно при сортировке с учетом регистра
  • извлечение доменных имен (имен хостов) из текстового файла
  • Как создать скрипт с обратным действием
  • Как сопоставить 2 больших файла и распечатать разницу в сценарии оболочки
  • Удаление определенных строк и дубликатов из текстового файла текстового слова 11gb
  • Сортировка по дате
  • Ограничение размера файла превышено в bash
  • Как привязать определенные файлы при использовании сортировки?
  • Interesting Posts

    Невозможно изменить JAVA_HOME

    Длина пароля RHEL7 PAM на основе UID

    Как я могу вставить цитаты в глубину?

    Как выполнить запрос-замену после заданного символа в строке?

    Самостоятельная виртуальная виртуальная машина VM

    Как сохранить закладки при перестановке страниц PDF-файла с помощью таких инструментов, как pdftk?

    основное объяснение по NSS, LDAP и PAM

    Каковы преимущества / недостатки иерархии файлов Linux по сравнению с другими ОС?

    Как получить дату сборки системы Debian?

    Как заблокировать одну пару мышь / клавиатуру на каждом экране?

    Поиск по шаблону и копирование в той же папке, но с другим именем

    Проблема с установкой Debian с USB-накопителем

    сетевой менеджер не перечисляет wifi

    Отсутствие вывода файла журнала при запуске скрипта под экраном, с перенаправлением консоли (тройник)

    Перенаправление доменов на разные порты на одном компьютере

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