web-dev-qa-db-ja.com

$ 2 ==特定の値の場合、$ 3列を印刷しますか?

私はawkプログラミング言語からawkを学び、この例に悩まされています。

$ 2がある値(例えば '1')に等しい場合に$ 3を印刷したいのであれば、このコマンドを使用して問題なく動作します。

awk '$2==1 {print $3}' <infile> | more

しかし、私が1を別の検索基準、例えば 'findtext'に置き換えたとき、このコマンドは機能しません。

awk '$1== findtext {print $3}' <infile> | more

これは何も出力を返さず、私が 'findtext'に入れたものがその場所に存在したと確信しています。構文に問題はありますか?

私はこれを試しましたが、うまくいきません。

awk '$1== "findtext" {print $3}' <infile> | more

しかし私がするとき

grep findtext <infile>  ## This does give me output

二重チェックしたように、findtextは$ 1にあります。

これは、たとえば 'test'という名前の私のテストファイルです。9行、8フィールド、スペースで区切られています。

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

これが私がしたこととその出力です。

$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

私はこれが彼らの8ドルに "ClNonZ"を持っている3ドルであることを期待しています。

0.180467091 
0.010615711 
0.492569002

Awkコマンドが何も返さなかった理由がわからない。何かご意見は?

97
user1687130

特定の文字列を探している場合は、それを引用符で囲みます。

awk '$1 == "findtext" {print $3}'

そうでなければ、awkはそれが変数名であると仮定します。

112
Rob Davis

このメソッドはregexpを使用します、それは動作するはずです:

awk '$2 ~ /findtext/ {print $3}' <infile>
28
Ell

AWKの実装にもよりますが、==を使っても大丈夫です。

~を試しましたか?たとえば、$ 1を "hello"にしたい場合は、次のようにします。

awk '$1 ~ /^hello$/{ print $3; }' <infile>

^は開始1ドル、$は終了1ドルです。

17
arutaku

これは私にとって読みやすいです

awk '{if ($2 ~ /findtext/) print $3}' <infile>
2
user2773013

私のawkのバージョンは3.1.5です。

はい、入力ファイルはスペース区切りです。タブはありません。

Arutakuの答えによると、これが私が試したところです。

awk '$8 ~ "ClNonZ"{ print $3; }' test  
0.180467091
0.010615711
0.492569002


$ awk '$8 ~ "ClNonZ" { print $3}' test  
0.180467091
0.010615711
0.492569002

うまくいかなかったもの(なぜか私のawkバージョンのせいか:)

$awk '$8 ~ "^ClNonZ$"{ print $3; }' test
$awk '$8 == "ClNonZ" { print $3 }' test

あなたの答え、コメントと助けてくれてありがとう!

2
user1687130