2012-05-09 101 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 -