Uczę się awk z języka programowania AWK i mam problem z jednym z przykładów.
Gdybym chciał wydrukować 3 $, jeśli 2 $ jest równe wartości (np. 1
), Użyłem tego polecenia, które działa dobrze:
awk '$2==1 {print $3}' <infile> | more
Ale kiedy zastępuję 1 innym kryterium wyszukiwania (np. findtext
), Polecenie nie działa:
awk '$1== findtext {print $3}' <infile> | more
Nie zwraca żadnych danych wyjściowych i jestem pewien, że w pliku wejściowym istnieje element „findtext”.
Też próbowałem, ale to nie działa:
awk '$1== "findtext" {print $3}' <infile> | more
Oto mój plik testowy o nazwie „test”, który ma 9 linii i 8 pól oddzielonych spacją:
1 11 0.959660297 0 0.021231423 -0.0073 -0.0031 MhZisp
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
3 19 0.98089172 0 0 -0.0158 0.0124 MhNonZ
4 15 0.704883227 0.265392781 0.010615711 -0.0087 -0.0092 MhZisp
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
6 23 0.715498938 0 0.265392781 -0.0013 -0.0309 Unkn
7 26 0.927813163 0 0.053078556 -0.0051 -0.0636 MhZisp
8 44 0.55626327 0.222929936 0.201698514 0.0053 -0.0438 MhZisp
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ
Oto, co zrobiłem i wynik:
$awk '$8 == "ClNonZ" {print $3}' test
$ grep ClNonZ test
2 14 0.180467091 0.800424628 0 0.0566 0.0103 ClNonZ
5 22 0.010615711 0.959660297 0.010615711 0.0476 0.0061 ClNonZ
9 31 0.492569002 0.350318471 0.138004246 0.0485 0.0088 ClNonZ
Spodziewam się, że to jest 3 $, które ma „ClNonZ” w 8 $.
0.180467091
0.010615711
0.492569002
Nie wiem, dlaczego polecenie awk nic nie zwróciło. jakieś pomysły?
Odpowiedzi:
Jeśli szukasz określonego ciągu, umieść go w cudzysłowie:
W przeciwnym razie awk przyjmie, że jest to nazwa zmiennej.
źródło
awk '{ print $8 }'
daje Ci to, czego można się spodziewać?AWK
implementacją (sprawdź toawk --version
), spójrz na moją odpowiedź, to działaGAWK
iMAWK
też.awk "$1 == \"findtext\" {print $3}"
Ta metoda używa wyrażenia regularnego, powinna działać:
źródło
W zależności od
AWK
implementacji, której używasz,==
jest w porządku lub nie.Czy próbowałeś
~
? Na przykład, jeśli chcesz, aby $ 1 oznaczało „cześć”:^
oznacza 1 $ początek i$
1 $ koniec.źródło
awk
nie pasował do==
, ale udało się~
.$1 == "hello"
i$1 ~ /^hello$/
. Nigdy nie powinieneś robić tego,$1 ~ "^hello$"
co pokazano w tej odpowiedzi, ponieważ używa ona łańcucha w kontekście wyrażenia regularnego, a zatem awk musi przekonwertować ten łańcuch na wyrażenie regularne przed jego użyciem, co ma efekty uboczne (man awk).To jest dla mnie bardziej czytelne
źródło
Moja wersja awk to 3.1.5.
Tak, plik wejściowy jest oddzielony spacjami, bez tabulatorów.
Zgodnie z odpowiedzią arutaku, oto co wypróbowałem, co zadziałało:
Co nie zadziałało (nie wiem dlaczego i może z powodu mojej wersji awk :),
Dziękuję wszystkim za odpowiedzi, komentarze i pomoc!
źródło
ClNonZ<control-M>
, a nieClNonZ
dlatego częściowe porównanie RE, takie jak wykonane za pomocą grep lub "~ "w awk znajduje to, ale porównanie równości nie.proszę spróbuj tego
lub
źródło