Tính tổng các giá trị trong một cột trừ tiêu đề


9

Tôi có một tập tin như được đưa ra dưới đây

--------------------------------------------------------------
Name_Customer   Item_Purchased  Item_Amount Credit
--------------------------------------------------------------
Tom              H1_P            7657        N/A    
Pras             Track_1         23          N/A
Cha              Brace           9           N/A
Moh              kite37          269         N/A
Prab             Bols            87699       N/A

Tôi cần thêm các giá trị dưới cột Item_Amountbằng cách bỏ qua tiêu đề trong tệp và in tổng dưới dạng

Total Amount collected = 95657

Câu trả lời:


14
awk '{s+=$3}END{print s}' yourfile

1
@coffeMug bạn có thể giải thích lý do tại sao sử dụng điều này: s+0?.
Lạnh

@Cold đừng nhớ chính xác tại sao số 0 đó lại ở đó! :-P Có vẻ không cần thiết nên đã gỡ bỏ nó!
coffeMug

1
@coffeMug có lẽ để đảm bảo awk coi cuộc tranh luận là một con số
Thorbjørn Ravn Andersen

5

Khá tầm thường khi sử dụng awk. Giả sử dữ liệu mẫu nằm trong một tệp , ex.txt:

$ awk '{total = total + int($3)}END{print "Total Amount collected = "total}' ex.txt

Thí dụ

$ awk '{total = total + $3}END{print "Total Amount collected = "total}' ex.txt 
Total Amount collected = 95657

Chi tiết

Sử dụng awkchúng tôi thu thập các giá trị từ cột thứ 3 ( $3) và tích lũy tổng phụ của chúng trong biến total. Sau khi hoàn thành, là điều cuối cùng cần làm END{..}, chúng tôi in thông báo cùng với giá trị của biến total.


chỉ cần thực hiện một thay đổiint($3)
Rahul Patil

1
Đó là int($3)những thứ nhỏ bé theo cách tôi cần.
bballdave025

2
total=0; 
for n in  $( tail -n +4 /tmp/reports.txt | awk '{print $3}') ; 
do 
   total=$( expr $total + $n ); 
done ; 
echo ">>$total" 

1
Bạn không thể thay đổi giá trị của một biến trong vòng lặp như thế. Xem câu trả lời của tôi ở đây để biết cách làm cho các biến có thể truy cập bên ngoài vòng lặp của họ.s
terdon

2

Cách awktiếp cận có lẽ là dễ nhất. Dưới đây là một vài lựa chọn khác:

Perl:

perl -lane '$k+=$F[2];END{print $k}' foo.txt

Coreutils tinh khiết:

t=0; tail -n +4 foo.txt | tr -s ' ' '\t' | cut -d $'\t' -f 3 | 
 while read i; do let t+=$i; echo $t; done  | tail -n 1

2

Nếu nó có thể giúp:

grep -Eo '[0-9\.]+' your_file|tr '\n' '+'|sed 's/\+$//'|bc -l

0

Đường ống này sẽ thực hiện công việc:

tail -n +4 the_file | awk '{ sum += $3 } END { printf "Total Amount collected = %d\n", sum }'

-1
awk '{FS=","}{s+=$6}END{print s}' Filename

1
Bạn có thể giải thích nó được không?
Prvt_Yadav

1
Chào mừng bạn đến với U & L, điều này hầu như không thêm bất cứ điều gì vào câu trả lời được chấp nhận và khác, ngoài ra tôi không thấy việc sử dụng FS.
Archemar

Cho rằng không có dấu phẩy trong đầu vào mẫu, làm thế nào để nó hoạt động?
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.