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.

Odpowiedzi:


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

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.