グループ別発生回数の計算

グループ別発生回数の計算

最初の列の各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 

関連情報