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.

PoGibas
quelle

Antworten:

158
awk '$3 ~ /snow/ { print }' dummy_file 
Ahmed Masud
quelle
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
Thunderbeef
quelle
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
Chris Seymour
quelle
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
Endoro
quelle
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,