按组计算出现次数

按组计算出现次数

计算第一列中每组第三列中存在多少个零。例如

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 }

将测试第三列是否为零,如果是,则增加该组的计数器。如果不是,它仍然会在count数组中为该组实例化一个空元素。我们需要它能够报告末尾有零个零的组。这next只是为了跳到下一个输入行。

muru 在评论中指出,这一位可以用稍微短一点的来代替

{ count[$1] += ($3 == 0) }

其中$3 == 0为 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 

相关内容