对一列求和,并在输入的每一行上打印该总和

问题描述 投票:23回答:7

我的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
bash sed awk printf
7个回答
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

7
投票

您可以使用:

awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
    '{print $0" "xyzzy}' file.txt

不幸的是,这意味着要遍历信息[[twice,但是,由于您必须在获得总计之前执行一次,因此没有真正的解决方法。 Any解决方案将涉及在输出任何内容(无论是数组还是返回文件)之前存储信息。

内部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


3
投票
使用数组

1
投票
Offtopic,但是在Perl中,您可以这样做:

1
投票
丑陋的解决方案:

1
投票
awk,是的,粘贴。

0
投票
一个小查询。如果要在最后一条记录旁边显示总和。如何?
© www.soinside.com 2019 - 2024. All rights reserved.