私は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コマンドが何も返さなかった理由がわからない。何かご意見は?
特定の文字列を探している場合は、それを引用符で囲みます。
awk '$1 == "findtext" {print $3}'
そうでなければ、awkはそれが変数名であると仮定します。
このメソッドはregexpを使用します、それは動作するはずです:
awk '$2 ~ /findtext/ {print $3}' <infile>
AWK
の実装にもよりますが、==
を使っても大丈夫です。
~
を試しましたか?たとえば、$ 1を "hello"にしたい場合は、次のようにします。
awk '$1 ~ /^hello$/{ print $3; }' <infile>
^
は開始1ドル、$
は終了1ドルです。
これは私にとって読みやすいです
awk '{if ($2 ~ /findtext/) print $3}' <infile>
私の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
あなたの答え、コメントと助けてくれてありがとう!