使用 sed、awk 和 perl 对新列中的行求和?

5 bash sed awk perl

我有一个包含数字的文件,例如:

1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5
Run Code Online (Sandbox Code Playgroud)

如何将行求和并输出到一列中,所以结果如下:

1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
Run Code Online (Sandbox Code Playgroud)

我想在 sed、awk 和 perl 中看到解决方案

cho*_*oba 8

Perl解决方案:

perl -MList::Util=sum -lane 'print "@F ", sum(@F)' < data.txt
Run Code Online (Sandbox Code Playgroud)
  • -n 逐行读取输入
  • -l 从输入中删除换行符并将它们添加到输出
  • -a 将空格上的每个输入行拆分为@F 数组
  • List::Util提供了该sum功能,因此您不必自己对数字求和

在 sed 中,算术几乎不可能实现,但您可以使用 sed 将空格转换为加号并将其用作bc获取总和的来源,并将结果粘贴到输入中:

paste -d ' ' data.txt <(sed -r 's/ /+/g' data.txt | bc)
Run Code Online (Sandbox Code Playgroud)


小智 4

假设您的数据保存在名为 data.txt 的文件中。

cat data.txt
1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式进行awk

awk '{X=$0}{split(X,x)}{print X , x[1]+x[2]+x[3]}' data.txt
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
Run Code Online (Sandbox Code Playgroud)

或者,根据 @RudiC 的评论:

awk '{print $0, $1+$2+$3}' data.txt
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用 `awk '{print $0, $1+$2+$3}' 文件`? (8认同)
  • `sed` 是一个(流)编辑器,而不是计算器。 (6认同)