您好,我需要获取文件中每一列的总和,需要灵活地处理任何给定文件中的尽可能多的列
目前我使用:
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