我的file.txt
看起来像这样:
1 12
2 18
3 45
4 5
5 71
6 96
7 13
8 12
我可以像这样总结第二列:
awk '{ sum += $2 } END { print sum }' file.txt
272
我能在每一行打印这笔钱的最佳方法是什么?这就是我所期待的:
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
答案 0 :(得分:19)
一种标准的awk
方式。
$ awk 'FNR==NR{sum+=$2;next}; {print $0,sum}' file.txt{,}
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
答案 1 :(得分:7)
您可以使用:
awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
'{print $0" "xyzzy}' file.txt
不幸的是,这意味着要通过信息两次但是,因为你必须在获得总数之前做一次,所以没有真正的解决方法。 任何解决方案都涉及在输出任何内容之前存储信息(无论是在数组中还是返回到文件中)。
内部awk
计算总数,awk
将其分配给变量,该变量可与每行一起打印。
将其应用于文件:
a 1
b 2
c 3
d 4
e 5
为您提供,因为1 + 2 + 3 + 4 + 5
等于15
:
a 1 15
b 2 15
c 3 15
d 4 15
e 5 15
答案 2 :(得分:3)
使用数组
{
a[NR] = $0
sum += $2
}
END {
for (x = 1; x <= NR; x++) {
print a[x], sum
}
}
输出
$ awk -f s.awk file.txt
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
中了解详情
答案 3 :(得分:1)
Offtopic,但在Perl中你可以做到:
perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
答案 4 :(得分:1)
丑陋的解决方案:
awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047 file ")}' file
答案 5 :(得分:1)
awk,是的,头部和粘贴。
$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -