文件中每列的总和,需要灵活地处理与文件中一样多的列

文件中每列的总和,需要灵活地处理与文件中一样多的列

您好,我需要获取文件中每一列的总和,需要灵活地处理任何给定文件中的尽可能多的列

目前我使用:

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'

然而,这只给了我第一列的总和,我显然可以循环它,但我更喜欢更简单的东西。

有什么想法/答案吗?

答案1

给出每列的总和,但在一列中(前提是数据以空格分隔):

$ cat data.in
1 2
3 4
5 6

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12 
9 

所以这是一个问题不在每个总和之间输出换行符

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9

printf()函数采用格式字符串。是%d整数的格式化字符串(用于%f浮点数),整数后面也会输出以下空格。然后,我们在循环后输出显式换行符。

另一种解决方法是使用ORS(“输出记录分隔符”)变量:

$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9

另请参阅 Dave Thompson 在下面的评论中关于 Awk 关联数组中键的排序(不保证排序)的富有洞察力的警告。

答案2

perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in

相关内容