如何分别根据其他列中的变量获取列中值的总和?

如何分别根据其他列中的变量获取列中值的总和?

我有一个如下表数据

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

相关内容