2012-05-09 43 views
23

My file.txt trông như thế này:awk tổng một cột và in mà tổng hợp trên mỗi dòng đầu vào

1 12 
2 18 
3 45 
4 5 
5 71 
6 96 
7 13 
8 12 

tôi có thể tóm tắt cột thứ hai như thế này:

awk '{ sum += $2 } END { print sum }' file.txt

272

Cách gọn gàng nhất để tôi có thể in số tiền đó trên mỗi dòng là gì? Đây là những gì tôi đang mong đợi:

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

Cảm ơn mọi người! Một số câu trả lời rất hữu ích ở đây. Chúc mừng. – Steve

Trả lời

19

Loại tiêu chuẩn awk cách.

$ 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

Hậu tố ký tự đại diện '{,}' là một cách viết tắt để lặp lại tên tệp đầu vào hai lần. Nó không phải là vỏ Bourne tiêu chuẩn. – tripleee

+1

Đây là AWK chuẩn và không lưu trữ tệp trong bộ nhớ. Nó phải là câu trả lời được chấp nhận. –

+0

@ DennisWilliamson, Xin chào, bạn vui lòng giải thích dựa trên lý do khiến awk này không lưu trữ tệp trong bộ nhớ?thanks –

1

Offtopic, nhưng trong Perl bạn có thể làm:

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

Bạn có thể sử dụng:

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

này không may có nghĩa là đi qua các thông tin hai lần nhưng, vì bạn phải làm điều đó một lần trước khi bạn nhận được tổng số, không có cách nào thực sự xung quanh nó. Mọi giải pháp sẽ liên quan đến việc lưu trữ thông tin trước khi xuất ra bất kỳ thứ gì (dù là trong mảng hay quay lại tệp).

Bên trong awk tính tổng số và bên ngoài awk gán cho biến có thể được in cùng với mỗi dòng.

Áp dụng đó đến file:

a 1 
b 2 
c 3 
d 4 
e 5 

mang đến cho bạn, bởi vì 1 + 2 + 3 + 4 + 5 bằng 15:

a 1 15 
b 2 15 
c 3 15 
d 4 15 
e 5 15 
+0

@codaddict: ý của bạn là "... _can't_ store ..."? – paxdiablo

+0

vâng .. Tôi không biết điều gì đã xảy ra ở đó :) – codaddict

3

Sử dụng mảng

{ 
    a[NR] = $0 
    sum += $2 
} 
END { 
    for (x = 1; x <= NR; x++) { 
     print a[x], sum 
    } 
} 

Output

$ 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 

Read more trong Gnu Awk Manual

1

Các giải pháp xấu xí:

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

awk, vâng, người đứng đầu và dán.

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt - 
Các vấn đề liên quan