awk脚本,用于基于多个条件对记录进行计数

时间:2019-01-16 09:38:19

标签: awk

我有一个3列的文件,如下所示

col1,col2
a,x,1
b,y,2
a,x,0
b,x,2
b,y,0
a,y,0

我正在使用awk脚本来获取以下输出:(按col1和col2分组以及总数,condition1,condition2的计数)

col1,col2,total count,count where col3=0, count where col3>0
a,x,2,1,1
a,y,1,1,0
b,x,1,0,1
b,y,2,1,1

我制定了一个脚本,使用以下命令分别获取全部3个脚本:

for case 3 : col3>0
awk -F',' '($3>0)NR>1{arr[$1","$2]++}END{for (a in arr) print a, arr[a]}' file 

其他情况下也类似。

我无法创建命令/脚本来一次性解决所有3种情况。

感谢您的帮助。

P.S .:此示例文件很小,因此我可以运行3个脚本/命令并将其加入,但对于实际文件而言,太大了,无法运行相同的瘦3次。

2 个答案:

答案 0 :(得分:2)

这里是一个:

$ awk '
BEGIN {                        
    FS=OFS=","                 # field separators
}
NR>1 {                         # after header
    k=$1 OFS $2                # set the key
    a[k]++                     # total count of unique $1 $2
    b[k]+=($3==0)              # count where $3==0
    c[k]+=($3>0)               # count where $3>0
}
END {                          # after all processing is done
    for(i in a)                # output values
        print i,a[i],b[i],c[i]
}' file

输出(以随机顺序输出,但您可以在注释中使用@Inian的提示进行修正):

a,y,1,1,0
b,x,1,0,1
b,y,2,1,1
a,x,2,1,1

答案 1 :(得分:0)

请尝试以下操作,这应该为您提供输入文件中第一字段和第二字段的特定顺序的答案,而无需使用任何awk的特定参数。

awk  '
BEGIN{
  FS=OFS=SUBSEP=","
}
FNR==1{
  print $0,"total_count,equal_to_3_values,more_than_3_values"
  next
}
!a[$1,$2]++{
  b[++count]=$1 FS $2
}
{
  c[$1,$2]++
  d[$1,$2]=$3>0?++d[$1,$2]:d[$1,$2]?d[$1,$2]:0
  e[$1,$2]=$3==0?++e[$1,$2]:e[$1,$2]?e[$1,$2]:0
}
END{
  for(i=1;i<=count;i++){
     print b[i],c[b[i]],d[b[i]],e[b[i]]
  }
}'   Input_file

输出如下。

col1,col2,total_count,equal_to_3_values,more_than_3_values
a,x,2,1,1
b,y,2,1,1
b,x,1,1,0
a,y,1,0,1