Используйте список слов для поиска в другом списке

8

У меня есть список из 250 строк. Я должен запустить их все через веб-сервер, чтобы получить список результатов. Этот список, однако, возвращает гораздо больше строк, чем мне интересно. Скажем, my list.txtis:

a.1
b.1
etc

тогда вывод output.txt:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

Можно ли использовать команду grep для поиска всех слов в list.txt в файле output.txt, а затем сгенерировать «требуемый» список wanted.txt? Мне нужна вся строка в файле output.txt. Я новичок в скриптинге, но мне хотелось бы что-то вроде

grep list.txt output.txt > wanted.txt

Я не смог найти никаких примеров этого

Ditte
источник
Они оба в алфавитном порядке, как ваши примеры?
Оли
Нет, у меня есть определенный не алфавитный порядок в моем list.txt, но output.txt является алфавитным, но я бы хотел, чтобы он содержал только «хиты» для моего list.txt в том же не алфавитном порядке
Дитт

Ответы:

11

Я бы проигнорировал grepэто. Это хорошо для регулярных выражений, но, похоже, вам это здесь не нужно. commМожно сравнить два файла и показать вам пересечения. Используя ваши точные примеры:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

Это быстрее, чем любой другой grep, но в значительной степени зависит от сортируемых файлов. Если это не так, вы можете предварительно отсортировать их, но это изменит выходные данные, поэтому они также будут отсортированы.

comm -12 <(sort list.txt) <(sort output.txt) 

Кроме того, этот ответ от iiSeymour позволит вам сделать это grep. Флаги запрашивают входной файл и инициируют поиск по полной строке с фиксированной строкой. Это не зависит от заказа, но будет основано на output.txtзаказе. Обратитесь к файлам, если вы хотите их в порядке list.txt.

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

Если ваш list.txtявляется действительно большим, то вы , возможно , придется решать эту немного больше итеративно и передать каждую строку Grep отдельно. Это значительно увеличит время обработки. Выше вы могли бы читать output.txtодин раз, но таким образом вы читали и обрабатывали его для каждой строки list.txt. Это ужасно ... Но это может быть ваш единственный выбор. С другой стороны, он сортирует вещи по list.txtпорядку.

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc
Оли
источник
1
Это действительно умно! В чем причина -12?
Дитт
3
-1подавляет строки, уникальные для первого файла, -2подавляет строки, уникальные для второго файла, и -3подавляет строки, общие для обоих файлов . Чтобы получить только общие черты, мы подавляем уникальность, следовательно -12.
Оли
отлично! Я думаю, что я буду использовать команду комм. И затем, когда я захочу отсортировать output.txt в том же порядке, что и list.txt, я просто потом буду использовать comm -12 <(sort list.txt) <(sort output.txt)?
Дитт
Команда comm не дала мне всю строку в result.txt (и мне нужно все это, чтобы получить информацию оттуда). Но если я попробую команду grep, она выдаст мне grep: нехватки памяти. Значит ли это, что он слишком большой?
Дитт
во втором примере избыточное перенаправление STDIN оболочка помечает как ошибку. или создавайте временные файлы, или используйте дополнительный fd с конвейерной сортировкой фона (сложно в большинстве оболочек) ... это больше вопрос программирования, который лучше задать при переполнении стека . лично я бы делал это на питоне.
Skaperen