awk częściowo pasuje do ciągu (jeśli kolumna / słowo jest częściowo dopasowane)

84

Mój fikcyjny plik wygląda następująco:

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

Chcę uzyskać wiersz, jeśli snoww 3 dolarach jest ciąg . Mogę zrobić to tak:

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

Ale powinien być prostszy sposób.

PoGibas
źródło

Odpowiedzi:

160
awk '$3 ~ /snow/ { print }' dummy_file 
Ahmed Masud
źródło
28
Ściśle mówiąc, druk nie jest potrzebny: '$3~/snow/'wystarczy
SheetJS
2
Niestety ten link jest już martwy: Oto aktualny link shop.oreilly.com/product/9781565924277.do
Stedy
Twój wzór to „śnieg”, a jeśli jest specjalny symbol, taki jak [\ ”w moim przypadku, indeks () jest lepszym rozwiązaniem.
Qiu Yangfan,
Czy istnieje sposób na zanegowanie czeku? Wiem, że możemy użyć „next” zamiast „print” i wydrukować wszystko inne, ale po prostu sprawdzam coś z mniejszą liczbą instrukcji
Sahas
5
posługiwać się ! więc np. awk '3 $! ~ / foo /'
Ahmed Masud
41

Możliwe również przez wyszukanie podciągu z funkcją index ():

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

Krótsza wersja:

awk 'index($3, "snow")' dummy_file
Thunderbeef
źródło
7
Jest to lepsze niż odpowiedź Ahmeda Masuda, ponieważ przetwarza „śnieg” jako dosłowny ciąg znaków, a nie jako wyrażenie regularne.
jarno
6
Mógłbyś napisać to jeszcze prościej:awk 'index($3, "snow")' dummy_file
jarno
2
Zgadzam się, że to lepsze niż moja odpowiedź.
Ahmed Masud
8

Wydrukuj linie, w których trzecie pole jest albo tylko snowalbo snowmantylko:

awk '$3~/^snow(man)?$/' file
Chris Seymour
źródło
2

GNU sed

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

Wejście:

C1 C2 C3    
1 śnieg   
2 b bałwan 
sowiec śnieżny
      snow snow snowmanx

..wynik:

1 śnieg
2 b bałwan
Endoro
źródło
9
Nie może to być bardziej skomplikowana odpowiedź na całkiem proste pytanie.
Sam
1
Poza tym używanie sedcałych słów jest BARDZO ryzykowne . Choć technicznie możliwe, aby to działało niezawodnie, musiałem używać patrzenia do tyłu, patrzenia w przód, a także !?konstrukcji, gdy chodziło o słowa, których nie powinno się podążać. To na pewno nic dla osób o słabym sercu. (I podatny na błędy, które mogą zająć dużo czasu, aby je znaleźć i naprawić.)
syntaxerror