Читання шаблонів 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опцією, якщо їх є більше), за винятком того, що при виклику з оболонки вам може знадобитися цитувати шаблон, щоб захистити спеціальні символи в ньому від розширення оболонкою.

Аргумент -Eабо, -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
"SO - перестань бути злим"

Це так давно, вибачте, що викопали його. Хоча вищезгадане пояснення є дивним, дещо розпливчато, чому шаблони (рядки) з файлу не відповідають без -Fпрапора. Моя здогадка, чи -в наведеному вище зразку рядка змушує це читати як послідовність символів? Хіба для цього теж не потрібні квадратні дужки? Я тестував деякі приклади файлів, але не дійшов висновку.
тр

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

@Gilles спасибі, на мене теж було враження, але @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.