我有一个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次。
答案 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