2016-05-14 13 views
0

Ich möchte ein Muster suchen, das ein bisschen komplex ist, ich habe bereits gelernt, dass ich \ | angeben muss anstelle von | im Skript, aber wie schließe ich den Leerraum ein, um genau diesem Muster zu entsprechen.Wie suche ich ein Muster mit den Leerzeichen in awk?

TR40663|c0_g1_i2|m.33339 TR40663|c0_g1_i2|g.33339 ORF TR40663|c0_g1_i2|g.33339 TR40663|c0_g1_i2|m.33339 type:5prime_partial len:1730 (+) TR40663\|c0_g1_i2:3-5192(+) [specie] 

Ich habe diesen Code zu verwenden, die eine Sequenz mit den Mustern

awk 'BEGIN{RS=">";FS="\n"}NR>1{if ($1~/pattern) print ">"$0}' file 

Ich weiß nicht, ob die ~/ist auch mit dem Code durcheinander verwandt abruft. Später werde ich eine Liste von Elementen in mehreren Dateien übergeben, aber jetzt möchte ich zuerst dieses Muster/diese Suche überprüfen.

Danke für die Hilfe

+0

Warum nicht grep verwenden? – stark

+0

@stark Sie können grep nicht verwenden, da grep zeilenbasiert ist, nicht wie awk aufzeichnungsbasiert ist. Daher können Sie kein Datensatztrennzeichen mit grep angeben, um mehrzeilige Datensätze zu suchen und zu drucken. Das Poster verwendet '>' anstelle von Zeilenumbrüchen, um Datensätze zu trennen. Andres - '~ /' ist kein Operator. '~' ist ein Operator und '/.../' sind die statischen Regexp-Trennzeichen. Befreien Sie sich von '/' von '~ /', da ich sicher bin, dass der Syntaxfehler Sie bereits dazu auffordert. –

+0

Whitespace hat in Regexp-Mustern keine besondere Bedeutung, Sie müssen also nichts Besonderes tun, um sie einzuschließen. – Barmar

Antwort

0

~/ ist kein Operator. ~ ist der Regexp-Comparsion-Operator und /.../ sind die statischen Regexp-Trennzeichen. Befreien Sie sich von / von ~/, da ich sicher bin, dass der Syntaxfehler Sie bereits dazu auffordert.

Die Syntax für dymamic regexps Verwendung ist:

awk -v re='foo \\| bar' '$0 ~ re' file 

oder:

awk -v re='foo [|] bar' '$0 ~ re' file 

niemals das Wort pattern, verwenden btw, wie es mehrdeutig und irreführend ist. In awk sollten Sie immer die Wörter regexp oder string verwenden, während die Shell globbing patterns verwendet, die in Funktionalität und Syntax ähnlich wie regexps sind, aber in der Semantik sehr unterschiedlich sind.

+0

Sein Code entspricht "$ 1", nicht "$ 0". – Barmar

+0

Ja und sein Code verwendet '>' als Datensatztrennzeichen, nicht '\ n'. Ich bin mir sicher, dass er angesichts der dynamischen Syntax-Vergleichssyntax, nach der er fragt, den Rest ausarbeiten kann. –

+0

Aber wie kann ich die Whitespaces einbeziehen? Ich muss diese genaue Zeichenfolge und wenn ich es wörtlich setze gibt es mehrere Datensätze zurück, ich brauche nur einen Datensatz (das ist der Datensatz an sich und etwas Text oder Sequenz unten), so muss ich diese lange Zeile mit Leerzeichen übereinstimmen. Danke für Ihre Hilfe –

0

wenn pattern eine awk Variable, die eine Zeichenfolge, die den regulären Ausdruck hält, dann muss man schreiben

if ($1 ~ pattern) 

mit kein zerschneidet.

wenn pattern nur ein Platzhalter in Ihrer Frage für die eigentliche Regex ist, dann sind Sie nicht die Endung Strich:

if ($1 ~ /pattern\|goes\|here/) 

Hinweise:

  • ~/ ist kein awk Betreiber
  • der Regex-Operator ist ~
  • Literal Regex Muster sind mit Schrägstrichen eingeschlossen : /foo.*bar/
+0

Ja, du hast recht Ich habe das Finale verpasst/aber ich habe diesen Code mit einer Zeile wie dieser {if ($ 1 ~/TR40663 \ | c0_g1_i2 \ | m.33339) schon gut geklappt. Meine Frage ist, wie man Leerzeichen hinzufügt und vermeidet, mehrere Übereinstimmungen zurückzugeben. Ich brauche nur eine Übereinstimmung, genau diese lange Zeichenfolge, die viele Leerzeichen enthält. –

+0

Wenn Sie genau diese Zeichenfolge möchten, verwenden Sie String-Gleichheit ('==') nicht Mustererkennung. –

+0

Entschuldigen Sie die Störung, ich habe versucht ($ 1 ==> TR10023 | c0_g1_i1 | m.6923 TR10023 | c0_g1_i1 | g.6923 ORF TR10023 | c0_g1_i1 | g.6923 TR10023 | c0_g1_i1 | m.6923 typ: komplette len: 176 (-) TR10023 | c0_g1_i1: 452-979 (-) [Name]) und auch die Zeichenfolge zwischen "" aber ich konnte die Übereinstimmung nicht finden Ich muss klarstellen Ich habe die genaue Zeile eingefügt, die ich finden wollte, ich teste das mit einer kleineren Beispiel und mit gedit, um es zu überprüfen. - –

Verwandte Themen