按两个字段对文件内容进行分组并对第三个字段求和

按两个字段对文件内容进行分组并对第三个字段求和

我在下面有一个文件,我想根据组第一和第二字段来总结第三个字段并进行计数。

文件

 AAA~111~2
 BBB~111~2
 AAA~111~1
 AAA~111~3
 AAA~222~2

预期输出

 AAA~111~6~3
 BBB~111~2~1
 AAA~222~2~1

到目前为止,我的代码仅总结了第三列

 awk 'BEGIN { FS=OFS=SUBSEP="~"}{arr[$1,$2]+=$3 }END {for (i in arr) print i,arr[i]}' File

答案1

您只需以与跟踪总和相同的方式跟踪计数即可:

$ awk -F'~' 'BEGIN { SUBSEP = OFS = FS } { s[$1,$2] += $3; ++c[$1,$2] } END { for (i in s) { print i, s[i], c[i] } }' file
AAA~111~6~3
BBB~111~2~1
AAA~222~2~1

您还可以选择像 GNU 这样的工具datamash,它知道如何对简单记录格式的数据计算基本内容,例如求和等:

$ datamash -t '~' -s groupby 1,2 sum 3 count 3 <file
AAA~111~6~3
AAA~222~2~1
BBB~111~2~1

此处,datamash要求将输入视为基于行的记录中以波形符分隔的字段。它将前两个字段的数据进行分组,同时添加两个新字段,该新字段由每组中所有记录的第三个字段的总和以及每组中的记录数组成。

如果输入数据按前两个字段排序,您可以删除该-s选项。

相关内容