我有一个包含数字的文件,例如:
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
并不真正适合进行任何形式的算术。