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

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

何千もの文字列が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"

答え2

私がこれを正しく理解したら、2番目の列に特定のアルファベットがあることを確認したい場合は、awk以下のスクリプトを試してください。このスクリプトはどれがあり、その数があるのか​​、どれが"NOT FOUND!"メモがないかを報告します。

awk -v alphabet="$(printf "%s" {a..z})" 'BEGIN{ split(alphabet, arr, "") }
    { chrs[$2]++ } END{ for(y in chrs) for(x in arr)
        { if(arr[x] in chrs) {print y, chrs[y]; delete arr[x]; break }
            else{ print arr[x]" NOT FOUND!"; delete arr[x] }
        }
}' infile

出力:

w 1
z 3
a 1
b 1
c 1
f NOT FOUND!
g NOT FOUND!
h NOT FOUND!
i NOT FOUND!
j NOT FOUND!
k NOT FOUND!
l NOT FOUND!
m NOT FOUND!
n NOT FOUND!
o NOT FOUND!
p NOT FOUND!
q NOT FOUND!
r NOT FOUND!
s NOT FOUND!
t NOT FOUND!
u NOT FOUND!
v NOT FOUND!
d 1
x NOT FOUND!
y NOT FOUND!
e 1

関連情報