lua -e 'a={}; for l in io.lines("exclude.list") do a[l]=true end; for l in io.stdin:lines() do if not a[l] then print(l) end end'
bash: lua: command not found
Согласитесь, это весомый недостаток
Когда вы в последний раз в реальной жизни видели статические хеш-таблицы? Сейчас в ходу динамические, которые всегда имеют ровно столько строк, сколько в них записано значений.
в реальной я их вообще не вижу, если честно. Вот 2-3 деревья, или ещё что-то подобное - это да.
Для меня тот же недостаток есть в предложенном вами mysql. Причём:
<...>
В ~100 раз!
да, ессно MySQL есть смысл использовать только если оно УЖЕ установлено (как у меня). Есть и альтернативный вариант - можно использовать как БД файловую систему. В этом есть и плюсы и минусы. Несомненных плюсов 2:
1) ФС есть у всех.
2) Для работы с ФС достаточно shell'а.
Учитывая, что там тоже 2-3дерево (в EXT), то время работы растёт так-же, как и в MySQL (а может и быстрее).
ЗЫЖ
И вообще, на самом деле, решение в данном случае очень сильно зависит от задачи. Иногда проще открыть vim и ручками вырезать
lua -e 'a={}; for l in io.lines("exclude.list") do a[l]=true end; for l in io.stdin:lines() do if not a[l] then print(l) end end'
Поточно обрабатывает stdin, исключая из него всё, что содержится в файле exclude.list. Быстрее вряд ли кто сделает. И не "портит" порядок строк.
если файл можно отсортировать, то:
$ sort -u file >otherfile
если уже отсортирован, то:
$ uniq file >otherfile
если сортировать нельзя, за один проход gnu-утилитами — никак. за четыре:
$ nl file | sort -u -k 2 | sort | cut -f 2 >otherfile
смысл:
1. пронумеровать строки.
2. отсортировать по второму полю и удалить дубликаты.
3. восстановить сортировку по номерам строк.
4. удалить номера строк.
кто придумает короче?
тут имелось ввиду другое... Не сделать из дублей "не дубли", а полностью удалить те строки, которые повторяются. Т. е. удалить обе строки.
два прохода.
1. собрать дубликаты в отдельный файл (uniq -d).
2. удалить из исходного файла все строки, совпадающие с полученными дубликатами. этот проход вы тут уже подробно разобрали.
Вот и первое применение скрипту. Имеется список всех IP, и "белый список" (IP, которым разрешён доступ к серверу). Белых IP уже значительно больше половины, так что есть смысл построить "Чёрный список" вместо белого, ибо меньше