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.