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.