降低文本文件中数据的复杂性

Dan*_*ani 2 awk perl text-processing

我有这个文件:

  1  2
  2  7
  3  4
  4  7
  5  3
  6  7
  7  1
  8  2
  9  4
Run Code Online (Sandbox Code Playgroud)

我想要的输出是

 1 13
 2 17
 3 7
Run Code Online (Sandbox Code Playgroud)

在我的输入中,我有 9 行,我想将其减少到三行,同时保留第二列的总量。例如,第一列中的 1 代表第二列中的 1,2,3 和 13,第一行代表加法 (2+4+7) 等等......知道吗?可能是通过使用 awk/perl 或任何其他 linux 工具。

roa*_*ima 5

这是一个awk解决方案:

awk '{ s+=$2; if (!(NR%3)) { k++; print k,s; s=0 } };
     END { if (NR%3) { k++; print k, s } }' file.txt
Run Code Online (Sandbox Code Playgroud)

它忽略第一列,更喜欢将其k作为输出行号生成。第二列在 中求和s,每三行 ( (NR % 3) == 0) 输出一次,累加器复位。最后,如果我们有任何剩余的行,我们输出剩余的总和。

示例文件的输出

1 13
2 17
3 7
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里是一个DRY版本,它使用一个函数来处理来自 modulo-3 和 END 块的重复代码:

awk 'function outsum() { print ++k,s; s=0 };
     { s+=$2; if (!(NR%3)) { outsum() } };
     END { if (NR%3) { outsum() } }' file.txt
Run Code Online (Sandbox Code Playgroud)