grepping с помощью символа «|» альтернативный оператор


96

Ниже приведен пример большого файла с именем AT5G60410.gff:

Chr5    TAIR10  gene    24294890    24301147    .   +   .   ID=AT5G60410;Note=protein_coding_gene;Name=AT5G60410
Chr5    TAIR10  mRNA    24294890    24301147    .   +   .   ID=AT5G60410.1;Parent=AT5G60410;Name=AT5G60410.1;Index=1
Chr5    TAIR10  protein 24295226    24300671    .   +   .   ID=AT5G60410.1-Protein;Name=AT5G60410.1;Derives_from=AT5G60410.1
Chr5    TAIR10  exon    24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  exon    24295134    24295249    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24295134    24295225    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  CDS 24295226    24295249    .   +   0   Parent=AT5G60410.1,AT5G60410.1-Protein;
Chr5    TAIR10  exon    24295518    24295598    .   +   .   Parent=AT5G60410.1

У меня возникли проблемы с извлечением определенных строк из этого с помощью grep. Я хотел извлечь все строки типа «ген» или типа «экзон», указанные в третьем столбце. Я был удивлен, когда это не сработало:

grep 'gene|exon' AT5G60410.gff

Результаты не возвращаются. Где я ошибся?


8
Попробуйте egrepвместо этого.
Кейт

ближе ли egrep к типу регулярных выражений, которые использует Perl? (это тот, который я использовал раньше)
MattLBeck

Ответы:


136

Вам нужно избежать |. Следующее должно работать.

grep "gene\|exon" AT5G60410.gff

argh, только что понял, что я следовал неправильному руководству по регулярному выражению для использования в grep. Кажется, я нигде не могу найти хороший grep. Спасибо за это!
MattLBeck

51

По умолчанию grep обрабатывает типичные специальные символы как обычные символы, если они не экранированы. Итак, вы можете использовать следующее:

grep 'gene\|exon' AT5G60410.gff

Однако вы можете изменить его режим, используя следующие формы, чтобы сделать то, что вы ожидаете:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff

28

Это другой способ поиска нескольких вариантов:

grep -e gene -e exon AT5G60410.gff

в -eключе определяет различные модели , чтобы соответствовать.


теперь вопрос, что быстрее? кто-нибудь знает?
Сталинко 06

1
@stalinko: у вас должна быть возможность использовать timeкоманду, чтобы узнать.
Натан Феллман

2

Это будет работать:

grep "gene\|exon" AT5G60410.gff

2
Какое значение имеет этот ответ, которого нет в stackoverflow.com/a/6775943/3933332 ?
Rizier123 01

3
@ Rizier123 - посмотрите на метки времени, оба ответили примерно в одинаковое время одним и тем же ответом.
xmnboy

Ага, всего на минуту позже. Тем не менее, я бы удалил ответ, который идентичен ответу, за который проголосовали. Особенно если бы за плечами было 40к репутации.
Аттила Чипак,

0

Я нашел этот вопрос, когда искал в Google конкретную проблему, с которой я столкнулся, используя конвейерную команду для grepкоманды, которая использовала оператор чередования в регулярном выражении, поэтому я подумал, что внесу свой более специализированный ответ.

Ошибка, с которой я столкнулся, оказалась связана с предыдущим оператором канала (т.е. |), а не с оператором чередования (т.е. |идентичным оператору канала) в регулярном выражении grep. Для меня ответ заключался в том, чтобы правильно экранировать и цитировать при необходимости специальные символы оболочки, такие как &, прежде чем предположить, что проблема связана с моим регулярным выражением grep, в котором задействован оператор чередования.

Например, на своем локальном компьютере я выполнил следующую команду:

get http://localhost/foobar-& | grep "fizz\|buzz"

Эта команда привела к следующей ошибке:

-bash: syntax error near unexpected token `|'

Эта ошибка была исправлена ​​путем изменения моей команды на:

get "http://localhost/foobar-&" | grep "fizz\|buzz"

Экранируя &символ двойными кавычками, я смог решить свою проблему. Ответ вообще не имел ничего общего с операцией чередования.

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