Я ищу команду или скрипт, чтобы сделать следующее - учитывая:
file1.txt:
abcd
efgh
ijkl
mnop
file2.txt:
123abcd123
123efgh123
123mnop123
Я хочу команду, которая делает что-то вроде этого:
ungrep file1.txt file2.txt
и возвращает следующее:
ijkl
Другими словами, он дает мне строки в file1.txt, которые не будут возвращать никаких результатов для файла file2.txt. Я знаю, что могу сделать это, перебирая file1.txt, подбирая file2.txt для каждой строки и сохраняя результат, и выводя любые строки, где результат пустой, но я надеялся на более эффективный способ сделать это.
sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u
но, как и ваше решение, это работает только тогда, когда файл шаблона на самом деле не содержит метасимволов регулярных выражений.grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
Вы можете сделать это с помощью
awk
:Используя
index
, мы ищем подстроки, а не сопоставляем регулярные выражения.Поскольку мы удаляем слово из массива, как только мы находим совпадение, мы избегаем ненужных поисков.
источник
w[$0]
имеет побочный эффект от добавления ключа в массив.if (a[$1])
вместо этогоif ($1 in a)
. Это дело каждый ,awk
включая оригиналawk
иnawk
, но , глядя на стандартных вчера, я не мог найти это указано.file1
это не так много (для некоторой огромной стоимости), я бы предпочел это решение, поскольку оно не требует какой-либо сортировкиfile2
и, как ожидается, будет намного более эффективным.