特定のフィールドに文字列を含む行がないことを確認してください。

特定のフィールドに文字列を含む行がないことを確認してください。

何千もの文字列が2番目の列にある場合は1つずつ検索する必要があり、そうでない場合は行の2番目の列にない各文字列に対して操作を実行する必要があります。

文書:

line a
line b
line c
line z
line d
line e
line z
line z

ファイル2:

line a
line b
line c
line d
line e

私が試したこと:

$ awk '{if($2=="z") {c++} } END { if(c==0) {print "no \"z\""} else { print c" \"z\"" }}' file
3 "z"
$ awk '{if($2=="z") {c++} } END { if(c==0) {print "no \"z\""} else { print c" \"z\"" }}' file2
no "z"
$ awk '{if($2=="z") {c++} } END { if(c!=0) {print "no \"z, action will be done\""} }' file
no "z, action will be done"

私のコードは大丈夫ですか、それとも単純化/最適化できますか?

アップデート:@RomanPerekhrestはあなたのコードを参照しています。 「else」だけを処理するか、「c」に否定を追加するには?そして残りは無視しますか?

私は努力しています:(c?:「いいえ」)、

しかし、うまくいきません。

@αГsнιе、ありがとうございます。ついに動作するスクリプトができました。

$ awk -v s="z" '$2==s{ c++ }END{ printf (!c ? NOP : "prepare command1\nprepare command2\nprepare command3\n") }' file
prepare command1
prepare command2
prepare command3
$ awk -v s="z" '$2==s{ c++ }END{ printf (!c ? NOP : "prepare command1\nprepare command2\nprepare command3\n") }' file2
$

または

$ awk -v s="z" '$2==s{ c++ }END{if(c==0) printf "prepare command1\nprepare command2\nprepare command3\n" }' file2
prepare command1
prepare command2
prepare command3
$ awk -v s="z" '$2==s{ c++ }END{if(c==0) printf "prepare command1\nprepare command2\nprepare command3\n" }' file
$

ベストアンサー1

渡すawk動的変数/パラメータ-v <var>=<value>

文字列テストケースz

awk -v s="z" '$2==s{ c++ }END{ printf "%s \042%s\042\n", (c? c : "no"), s }' file

出力:

3 "z"

文字列テストケースw

awk -v s="w" '$2==s{ c++ }END{ printf "%s \042%s\042\n", (c? c : "no"), s }' file

出力:

no "w"

おすすめ記事