2012-05-09 65 views
23

file.txt的每一行总结如下:AWK之列,并打印上输入

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

谢谢大家!这里有些非常有用的答案。干杯。 – Steve

回答

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 
+0

'{,}'通配符后缀是重复输入文件名两次的简写。这不是标准的Bourne shell。 – tripleee

+1

这是规范的AWK,不会将文件存储在内存中。它应该是被接受的答案。 –

+0

@DennisWilliamson,你好,请你解释一下这个awk不存储文件的原因是什么?谢谢 –

1

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

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt 
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 
+0

@codaddict:你的意思是“... _无法存储...”吗? – paxdiablo

+0

是的..我不知道那里发生了什么:) – codaddict

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 Manual

1

丑陋的解决方案:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047 file ")}' file 
1

awk的,是的,头部和粘贴。

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -