![如何分别根据其他列中的变量获取列中值的总和?](https://linux22.com/image/142662/%E5%A6%82%E4%BD%95%E5%88%86%E5%88%AB%E6%A0%B9%E6%8D%AE%E5%85%B6%E4%BB%96%E5%88%97%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%E8%8E%B7%E5%8F%96%E5%88%97%E4%B8%AD%E5%80%BC%E7%9A%84%E6%80%BB%E5%92%8C%EF%BC%9F%20.png)
我有一个如下表数据
abc 1 1 1
bcd 2 2 4
bcd 12 23 3
cde 3 5 5
cde 3 4 5
cde 14 2 25
我想要根据第一列中的变量计算每列中的值的总和,所需的结果如下所示:
abc 1 1 1
bcd 14 25 7
cde 20 11 35
我像这样使用 awk 命令
awk -F"\t" '{for(n=2;n<=NF; ++n)a[$1]+=$n}END{for(i in a ) print i, a[i] }' tablefilepath
我得到的结果如下:
abc 3
bcd 46
cde 66
我认为我的代码结尾是错误的,但不知道如何修复它。我需要一些指示来修复代码。
答案1
你们已经相当接近了。你知道自己做错了什么,不是吗?您为每个第 1 列值保留了一个总计,而您本应保留三个。
这类似于伊尼安的回答,但可以轻松扩展以处理任意数量的列:
awk -F"\t" '{for(n=2;n<=NF; ++n) a[$1][n]+=$n}
END {for(i in a) {
printf "%s", i
for (n=2; n<=4; ++n) printf "\t%s", a[i][n]
printf "\n"
}
}'
它不像 Inian 的答案那样保留三个数组,而是保留一个二维数组。
答案2
只要您的文件是制表符分隔的,数据混合很适合这个。
$ datamash groupby 1 sum 2 sum 3 sum 4 < tablefilepath
abc 1 1 1
bcd 14 25 7
cde 20 11 35
如果您指定 ,Datamash 还可以使用非选项卡-t <delimiter>
。但选项卡似乎最接近您提供的示例输入。
数据整合惯于如果您的输入由任意空格分隔(即可能有多个空格旨在“看起来像”制表符),则可以工作。尽管如此,即使这就是您的数据的样子,它也很容易被整合成 datamash 期望的形式:
sed -i 's/ \+/\t/g' tablefilepath
答案3
awk
根据 1 对第 2-4 列进行求和。
awk -v FS="\t" -v OFS="\t" '{ col1[$1]+=$2; col2[$1]+=$3; col3[$1]+=$4; next } END { for ( i in col1) print i, col1[i], col2[i], col3[i] }' file