LINUX.ORG.RU

Как вычесть из одного списка другой

 


0

3

Подскажите пожалуйста - как вычесть из одного текстового списка другой на bash

Нашел вот такой вариант:

{ cat text1.txt | sort -u; cat text2.txt text2.txt; } | sort | uniq -u > resultat.txt

Но такое вычитание при работе со списками 5-10 млн строк отнимает по несколько часов. Есть ли более быстрые варианты сравнения списков.

Попробовал diff, но при выполнении «diff: memory exhausted» , вроде памяти не хватает…

попробовал comm -13 <(sort text1.txt) <(sort text2.txt) > resultat.txt

тоже очень медленный вариант, а больше ничего не нашел

Есть ли более быстрые варианты сравнения списков.

Есть. Без башика. СУБД, хотя 5-10М строк должны в память влезть.

crutch_master ★★★★★
()

Просто используй более подходящий инструмент чем bash. Кроме того, у тебя там sort неясно зачем вызывается, да еще дважды. uniq и не сортировынный список должен уметь обрабатывать.

ptah_alexs ★★★★★
()
Ответ на: комментарий от ptah_alexs

uniq и не сортировынный список должен уметь обрабатывать.

Нет, не должен.

anonymous
()
Ответ на: комментарий от YAR

пойдёт, конечно

fgrep -xvf exclude_this.txt from_this.txt > resultat.txt

— быстро и порядок строк не меняется.

comm, кстати, не совсем правильный результат даёт. я не разбирался в чём именно косяк, но размер файла отличается.

anonymous
()

5-10 млн строк

на bash

да что, чёрт побери, ты такое несёшь

jenodin
()
Ответ на: комментарий от anonymous

Благодарю за ответ!! Вы мне очень помогли! Работает превосходно, только текст перед этим нужно привести в единый формат(конец строк CRLF или LF, короче одинаковый в обоих файлах).

alexross
() автор топика
Ответ на: комментарий от ptah_alexs

Note: ‘uniq’ does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use ‘sort -u’ without ‘uniq’.

zmc
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.