Чтение шаблонов grep из файла


49

У меня есть несколько больших текстовых файлов, и в файле у UNIQS.txtменя есть список строк grepиз другого файла. Код, который я использую

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

который ничего не делает - сгенерированный файл пуст. Но когда я сделаю

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

это работает правильно. Это смущает меня, потому что я не думал, grepчто интерпретировал бы записи UNIQS.txtкак шаблоны регулярных выражений без кавычек и слэшей и так далее, находящиеся в файле (чего нет). В общем случае, если вы получаете шаблоны из файла, он автоматически будет думать, что они являются шаблонами регулярных выражений?

Редактировать: В UNIQS.txtфайле есть строки, разделенные символом новой строки

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(называемые именами шаблонов) и EEP_VSL...разделенные табуляцией столбцы с примерно 14 столбцами, а первый столбец - это имя шаблона, поэтому в основном я хочу извлечь строку, соответствующую каждому шаблону в файле.

Ответы:


60

-fПараметр определяет файл , в котором Grep читает шаблоны. Это похоже на передачу шаблонов в командной строке (с -eвозможностью, если их больше одного), за исключением того, что при вызове из оболочки вам может потребоваться заключить шаблон в кавычки, чтобы защитить специальные символы в нем от раскрытия оболочкой.

Аргумент -Eor -Fили -P, если таковой имеется, сообщает grep, в каком синтаксисе записаны шаблоны. Без аргументов grep ожидает базовые регулярные выражения ; с -E, grep ожидает расширенные регулярные выражения ; с -P(если поддерживается), grep ожидает регулярные выражения Perl ; и с -F, grep ожидает буквальные строки. Не важно, будут ли шаблоны взяты из командной строки или из файла.

Обратите внимание, что строки являются подстроками: если вы передадите a+bкак шаблон, то строка, содержащая a+b+cсовпадение. Если вы хотите найти строки, содержащие ровно одну из предоставленных строк и не более, то передайте эту -xопцию.


1
Хорошо, это полезно, спасибо. Могу ли я спросить, предположим, что я хотел точно соответствовать строке, то есть, если строка равна 12345, то я хочу, чтобы она соответствовала только на 12345, а не на 123456 или 123455 и т. Д., Как мне поступить?
sdf

2
@sdf Прочитайте мой последний абзац:-x
Жиль "ТАК - перестань быть злым"

Это так старо, извините, что выкопал это. Хотя вышеприведенное объяснение является удивительным, оно немного расплывчато из-за того, почему шаблоны (строки) из файла не соответствуют без -Fфлага. Я думаю, что -в приведенной выше строке образца это будет читаться как последовательность символов? Разве это не потребует квадратных скобок тоже? Я протестировал с некоторыми примерами файлов, но не пришел к выводу.
ТРС

@trs Строка, показанная в вопросе (которая была добавлена ​​после того, как я опубликовал свой ответ), не содержит символов, которые имеют особое значение в регулярных выражениях, поэтому она ведет себя одинаково как с так и без -F. Это будет иметь значение с такими персонажами, как \[*^$.
Жиль "ТАК - перестать быть злым"

@ Жиль, спасибо, это тоже мое впечатление, но @sdf утверждает, что «сгенерированный файл пуст» (читай: нет совпадений) без -Fфлага?
ТРС

0

У меня была та же ошибка, не решенная с хорошим ответом от @gilles. Присмотревшись ближе во входном файле, я нашел 2 символа новой строки в конце. Без этого успеха нужно только: grep -i file_pattern_input file

(GNU grep 3.1, входной файл более 5000 записей, файл сопоставления / шаблон 2536, я знал, что все 2536 должны быть в файле. С помощью новой строки были получены все строки файла и без только 2536 совпадающих строк)


1
Это не связано с проблемой ОП. Пустая строка читается grep как пустой шаблон, и пустой шаблон соответствует везде.
Муру
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.