Greppen mit dem "|" alternativer Betreiber


90

Das folgende Beispiel zeigt eine große Datei mit dem Namen 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

Ich habe einige Probleme, bestimmte Zeilen mit grep daraus zu extrahieren. Ich wollte alle Linien extrahieren, die vom Typ "Gen" oder vom Typ "Exon" sind, wie in der dritten Spalte angegeben. Ich war überrascht, als dies nicht funktionierte:

grep 'gene|exon' AT5G60410.gff

Es werden keine Ergebnisse zurückgegeben. Wo bin ich falsch gelaufen?


8
Versuchen Sie es egrepstattdessen.
Keith

Ist egrep näher an der Art von Regex, die Perl verwendet? (Dies ist die, die ich zuvor verwendet habe)
MattLBeck

Antworten:


134

Sie müssen dem entkommen |. Das Folgende sollte den Job machen.

grep "gene\|exon" AT5G60410.gff

Ich habe gerade festgestellt, dass ich das falsche Regex-Tutorial für die Verwendung in grep befolgt habe. Ich kann nirgendwo einen guten Grep finden. Danke dafür!
MattLBeck

48

Standardmäßig behandelt grep die typischen Sonderzeichen als normale Zeichen, sofern sie nicht maskiert werden. Sie können also Folgendes verwenden:

grep 'gene\|exon' AT5G60410.gff

Sie können den Modus jedoch ändern, indem Sie die folgenden Formulare verwenden, um das zu tun, was Sie erwarten:

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

27

Dies ist eine andere Art, nach einigen Optionen zu suchen:

grep -e gene -e exon AT5G60410.gff

Der -eSchalter gibt verschiedene übereinstimmende Muster an.


Jetzt ist die Frage, was ist schneller? Weiss es jemand?
Stalinko

1
@stalinko: Sie sollten in der Lage sein, den timeBefehl zu verwenden, um herauszufinden.
Nathan Fellman


0

Ich habe diese Frage gefunden, als ich nach einem bestimmten Problem gegoogelt habe, bei dem ein Befehl an einen grepBefehl weitergeleitet wurde, der den Wechseloperator in einer Regex verwendete, und dachte, ich würde meine speziellere Antwort einbringen.

Es stellte sich heraus, dass der Fehler, mit dem ich konfrontiert war, beim vorherigen Pipe-Operator (dh |) und nicht beim alternativen Operator (dh |identisch mit dem Pipe-Operator) im Grep-Regex lag. Die Antwort für mich war, richtig zu entkommen und spezielle Shell-Zeichen wie & zu zitieren, bevor angenommen wurde, dass das Problem bei meinem Grep-Regex lag, an dem der Wechseloperator beteiligt war.

Der Befehl, den ich auf meinem lokalen Computer ausgeführt habe, war beispielsweise:

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

Dieser Befehl führte zu folgendem Fehler:

-bash: syntax error near unexpected token `|'

Dieser Fehler wurde behoben, indem mein Befehl geändert wurde in:

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

Indem &ich dem Charakter mit doppelten Anführungszeichen entkommen konnte, konnte ich mein Problem lösen. Die Antwort hatte überhaupt nichts mit der Wechseloperation zu tun.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.