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 工具。
这是一个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)