如何为 n 列而不是 3 列编写 awk '{print $1+$2+$3} file1 > file2?

Hit*_*nia 4 awk text-processing

awk '{ for (i = 1; i <= NF; i++) sum[i]+=$i} END{for (i in sum) print sum[i]}' file1 > file2
Run Code Online (Sandbox Code Playgroud)

这有助于按记录求和,但类似的方案无助于按列求和(也许)。如何将按列加法推广到 n 列?

cat file1
23 46 45
45 57 58
56 78 74

cat file2
114
160
208
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 6

你想计算每条记录的字段总和,所以它只是:

awk '{sum = 0; for (i = 1; i <= NF; i++) sum += $i; print sum}' < file1 > file2
Run Code Online (Sandbox Code Playgroud)

花括号开始一个动作语句,该语句在输入的每一行上执行;没有前面的条件将其执行限制为满足此类条件的行

在每一行:

  1. sum变量初始化为零。
  2. 循环遍历字段,从字段 #1 开始,到最后一个字段(特殊变量NF)结束,并按sum该字段的值 ( $i)递增。
  3. 打印sum变量的值。

  • 我试过这个,但它没有完成。该命令继续运行,终端上没有任何变化。 (2认同)
  • @HitanshuSachania 如果您不明白这一点,那么您是如何根据答案编写版本的,哪个更复杂?(但是请注意,`(for i in sum)` **不**保证以任何特定顺序迭代键(而真正的 `nawk` 1..100 键的顺序将类似于59,22,2,23,3,...,21,1)。 (2认同)
  • @HitanshuSachania 因为 awk 数组通常是使用 [哈希表](https://en.wikipedia.org/wiki/Hash_table) 实现的,并且每个实现都可能使用自己的哈希函数,并且可以按顺序遍历键它们存储在表 + 链表结构中。即使使用 `mawk`(debian 中的默认 `awk`),以下内容也会先打印 21:`awk 'BEGIN{a[1]=a[21]=1;for(i in a) print i}'` (2认同)