最初の列の各3番目の列セットにゼロがいくつあるかを計算します。例えば
A 1 0
A 2 0
A 3 2
B 1 2
希望の出力:
A 2
B 0
それは次のとおりです。
cat input | awk '{if($3>0) total+=1}END{print total}'
しかし、それぞれ異なる$1グループごとに
ありがとうございます!
答え1
連想配列を使用して、awk
各グループにゼロが表示される回数を計算します。
awk '$3 == 0 && ++count[$1] || count[$1] { next } END { for (group in count) printf("%s%s%d\n", group, OFS, count[group]) }' file
やや恥ずかしい
$3 == 0 && ++count[$1] || count[$1] { next }
3番目の列が0かどうかをテストし、その場合はそのグループのカウンタをインクリメントします。それ以外の場合でも、count
そのグループの配列の空の要素をインスタンス化します。最後にゼロのグループを報告するには、この機能が必要です。これはnext
単に次の入力ラインにジャンプすることです。
muruは、コメントでこれを少し短く置き換えることができると指摘しました。
{ count[$1] += ($3 == 0) }
これは$3 == 0
、3番目の列の値に応じて0または1です。
最終出力は次のように行われますprintf()
。
printf("%s%s%d\n", group, OFS, count[group])
OFS
これにより、(出力フィールド区切り文字、デフォルトは空白文字)の間にグループ(入力データの最初の列から始まる)と対応するゼロの数が印刷されます。
セットに数が欠落している場合、printf()
フォーマットは%d
ゼロを挿入します。
テスト:
$ awk '$3 == 0 && ++count[$1] || count[$1] { next } END { for (group in count) printf("%s%s%d\n", group, OFS, count[group]) }' file
A 2
B 0
答え2
for i in `awk '{if(!seen[$1]++){print $1}}' p.txt`; do re=`awk -v i="$i" '$1 == i && $3 == "0" {print i,NR}' p.txt|wc -l`; echo "$i $re"; done
出力
A 2
B 0
答え3
awk '{
##use key-value array in awk
if($1 in STORE){
if($3 ==0){
STORE[$1]+=1
} ##if ends for 3rd column check
} ##if ends for A/B check
else{
if($3 ==0){
##check if third column is zero
STORE[$1]=1
}else{
##if not zero, make value as zero
STORE[$1]=0
}
} ##else if A/B not in Store
}
END{
##print everything using for loop
for(key in STORE){
print key, STORE[key]
}
} ' file.txt