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

使用 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

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

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

我希望看到 sed、awk 和 perl 中的解决方案

答案1

Perl解决方案:

perl -MList::Util=sum -lane 'print "@F ", sum(@F)' < data.txt
  • -n逐行读取输入
  • -l从输入中删除换行符并将其添加到输出中
  • -a将空白处的每个输入行拆分到 @F 数组中
  • 列表::实用程序提供该sum函数,因此您不必自己对数字求和

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

paste -d ' ' data.txt <(sed -r 's/ /+/g' data.txt | bc)

答案2

假设您的数据保存在名为 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

您可以按如下方式进行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

或者,根据 @RudiC 的评论:

awk '{print $0, $1+$2+$3}' data.txt

答案3

对于任意数量的列,使用awk

$ awk '{ sum = 0; for (i = 1; i <= NF; i++) sum += $i; $(NF + 1) = sum } 1' <file
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

NF是当前记录(默认为行)中的字段数(默认为空格分隔的列)。通过sum循环计算并设置$(NF + 1)总计,我们在末尾添加一个新列。这个新列与其他列一起由脚本1末尾的单独打印awk(可以用 替换{ print })。


sed并不真正适合进行任何形式的算术。

答案4

纯 bash 解决方案怎么样?

while read -r a b c; do
    echo $a $b $c $((a+b+c))
done < input

样品运行

相关内容