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

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

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

. Я не смог найти ни одного примера этого

. ]
8
задан 11 March 2015 в 12:09

1 ответ

Я проигнорировал бы 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
11
ответ дан 11 March 2015 в 12:09

Другие вопросы по тегам:

Похожие вопросы: