awk teilweise String-Übereinstimmung (wenn Spalte / Wort teilweise übereinstimmen)


83

Meine Dummy-Datei sieht folgendermaßen aus:

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

Ich möchte eine Zeile erhalten, wenn snowin $ 3 ein String enthalten ist . Ich kann das so machen:

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

Aber es sollte einen einfacheren Weg geben.

Antworten:


158
awk '$3 ~ /snow/ { print }' dummy_file 

28
'$3~/snow/'
Genau

2
Leider ist dieser Link bereits tot: Hier ist der aktuelle Link shop.oreilly.com/product/9781565924277.do
Stedy

Ihr Muster ist "Schnee", während, wenn es ein spezielles Symbol gibt, wie [\ "in meinem Fall, der Index () eine bessere Lösung ist.
Qiu Yangfan

Gibt es eine Möglichkeit, den Scheck zu negieren? Ich weiß, wir können 'next' anstelle von 'print' verwenden und alles andere drucken, aber nur nach etwas mit weniger Anweisungen
suchen

5
verwenden ! also zB awk '$ 3! ~ / foo /'
Ahmed Masud

41

Möglich auch durch Suche nach Teilzeichenfolgen mit der Funktion index ():

awk '(index($3, "snow") != 0) {print}' dummy_file

Kürzere Version:

awk 'index($3, "snow")' dummy_file

7
Dies ist besser als die Antwort von Ahmed Masud, da "Schnee" als wörtliche Zeichenfolge und nicht als regulärer Ausdruck verarbeitet wird.
jarno

6
Sie könnten es noch einfacher schreiben:awk 'index($3, "snow")' dummy_file
jarno

2
Ich stimme zu, dass dies besser ist als meine Antwort.
Ahmed Masud


8

Drucken Sie Zeilen, in denen das dritte Feld entweder snowoder snowmannur:

awk '$3~/^snow(man)?$/' file

2

GNU sed

sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file

Eingang:

C1 C2 C3    
1 ein Schnee   
2 b Schneemann 
Schnee c Sowman
      Schnee Schnee Schneemann

..Ausgabe:

1 ein Schnee
2 b Schneemann

9
Dies könnte keine kompliziertere Antwort auf eine ziemlich einfache Frage sein.
Sam

1
Außerdem ist es SEHR riskant, sedganze Wörter zu verwenden. Obwohl dies technisch möglich war, musste ich, damit dies zuverlässig funktioniert, sowohl Look-Behind-, Look-Forward- als auch !?Konstruktionen verwenden, wenn es um Wörter ging, die nicht folgen sollten. Das ist nichts für schwache Nerven, das ist sicher. (Und anfällig für Fehler, die viel Zeit in
Anspruch nehmen,
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.