计算第一列中每组第三列中存在多少个零。例如
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