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

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


тепер питання в тому, що швидше? хтось знає?
Сталінко

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

2

Це буде працювати:

grep "gene\|exon" AT5G60410.gff

2
Яке значення має ця відповідь, чого не має цей stackoverflow.com/a/6775943/3933332 ?
Rizier123

3
@ Rizier123 - подивіться на мітки часу, обидва відповіли майже однаково раз однаковою відповіддю.
xmnboy

Так, лише на хвилину запізнення. Тим не менше, я б видалив відповідь, ідентичну прихильній відповіді. Особливо якби під моїм поясом була репутація 40 тисяч.
Аттіла Чіпак,

0

Я знайшов це запитання під час пошуку в Google для певної проблеми, з якою я стикався із командою pipe, до 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.