24

我的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
4

6 回答 6

20

一种标准的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
于 2012-05-09T07:04:36.047 回答
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
于 2012-05-09T06:44:39.977 回答
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

在Gnu awk 手册中阅读更多内容

于 2012-05-09T06:47:24.017 回答
1

离题,但在 Perl 中你可以这样做:

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
于 2012-05-09T06:44:13.283 回答
1

丑陋的解决方案:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047  file ")}' file
于 2012-05-09T11:50:37.947 回答
1

awk,是的,头和粘贴。

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -
于 2012-05-10T01:17:24.573 回答