2013-10-03 14 views
38

Tôi đang cố gắng tìm mức trung bình của cột dữ liệu thứ hai sử dụng awk cho một lớp học. Đây là mã hiện tại của tôi, với khuôn khổ giảng viên của tôi cung cấp:Sử dụng awk để tìm mức trung bình của một cột

#!/bin/awk 

### This script currently prints the total number of rows processed. 
### You must edit this script to print the average of the 2nd column 
### instead of the number of rows. 

# This block of code is executed for each line in the file 
{ 
x=sum 
read name 
     awk 'BEGIN{sum+=$2}' 
     # The script should NOT print out a value for each line 
} 
# The END block is processed after the last line is read 
END { 
     # NR is a variable equal to the number of rows in the file 
     print "Average: " sum/ NR 
     # Change this to print the Average instead of just the number of rows 
} 

và tôi nhận được một lỗi mà nói:

awk: avg.awk:11:  awk 'BEGIN{sum+=$2}' $name 
awk: avg.awk:11:   ^invalid char ''' in expression 

Tôi nghĩ tôi gần nhưng tôi thực sự không có ý tưởng nơi để đi từ đây. Mã không phải là vô cùng phức tạp như tất cả mọi thứ chúng ta đã thấy trong lớp đã được khá cơ bản. Làm ơn cho tôi biết.

+1

Tôi không phải lo lắng nhiều, nhưng điều này có giúp được không: http://stackoverflow.com/questions/8434000/awk-calculate-average-or-zero?rq=1 –

Trả lời

84
awk '{ sum += $2; n++ } END { if (n > 0) print sum/n; }' 

Cộng các chữ số trong $2 (cột thứ hai) trong sum (biến được tự động khởi tạo zero bởi awk) và tăng số lượng hàng (mà cũng có thể được xử lý thông qua tích hợp NR biến). Cuối cùng, nếu có ít nhất một giá trị được đọc, hãy in mức trung bình.

awk '{ sum += $2 } END { if (NR > 0) print sum/NR }' 

Nếu bạn muốn sử dụng các ký hiệu công việc, bạn có thể viết:

#!/bin/awk 

{ sum += $2 } 
END { if (NR > 0) print sum/NR } 

Bạn cũng có thể kiểm soát các định dạng của các trung bình với printf() và định dạng phù hợp ("%13.6e\n", ví dụ).

Bạn cũng có thể khái quát các mã để trung bình cột thứ N (với N=2 trong mẫu này) sử dụng:

awk -v N=2 '{ sum += $N } END { if (NR > 0) print sum/NR }' 
1
awk 's+=$2{print s/NR}' table | tail -1 

Tôi đang sử dụng tail -1 để in các dòng cuối cùng mà cần phải có số lượng trung bình. ..

+2

Cách làm rất kỳ lạ nhiều thứ. Nó hoạt động, nhưng tôi không thể nghĩ ra một lý do chính đáng để sử dụng kỹ thuật này. –

4

lỗi cụ thể của bạn là với dòng 11:

awk 'BEGIN{sum+=$2}' 

Đây là một đường mà tại đó yêu cầu awk và khối BEGIN của nó được chỉ định - nhưng bạn đã ở trong một tập lệnh awk, do đó bạn không cần phải chỉ định awk. Ngoài ra, bạn muốn chạy sum+=$2 trên mỗi dòng đầu vào, do đó bạn không muốn nó trong khối BEGIN. Do đó dòng đơn giản nên đọc:

sum+=$2 

Bạn cũng không cần các dòng:

x=sum 
read name 

là người đầu tiên chỉ tạo ra một từ đồng nghĩa với sum tên x và tôi không chắc chắn về thứ hai không, nhưng không cần thiết.

Điều này sẽ làm cho kịch bản awk của bạn:

#!/bin/awk 

### This script currently prints the total number of rows processed. 
### You must edit this script to print the average of the 2nd column 
### instead of the number of rows. 

# This block of code is executed for each line in the file 
{ 
    sum+=$2 
    # The script should NOT print out a value for each line 
} 
# The END block is processed after the last line is read 
END { 
    # NR is a variable equal to the number of rows in the file 
    print "Average: " sum/ NR 
    # Change this to print the Average instead of just the number of rows 
} 
câu trả lời

Jonathan Leffler của cung cấp cho các awk lót đại diện cho mã cố định tương tự, với việc bổ sung kiểm tra rằng có ít nhất 1 dòng đầu vào (điều này dừng bất kỳ sự phân chia nào bằng lỗi 0).Nếu

+0

Điều đó đã làm các trick, cảm ơn rất nhiều! Tôi đã không nhận ra bởi vì nó đang ở trong một kịch bản lúng túng mà không cần lệnh awk, sai lầm tân binh. Cảm ơn một lần nữa –

+0

@ BenZifkin nếu bạn tìm thấy câu trả lời của tôi hữu ích, bạn có thể chấp nhận câu trả lời? – imp25

3

Hãy thử điều này:

ls -l | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}' 

NR là một AWK BUILTIN biến để đếm không. của hồ sơ

+0

Chào mừng bạn đến với Stack Overflow. Nếu bạn thêm một câu trả lời mới cho câu hỏi đã được vài tháng tuổi và câu trả lời đó bao gồm câu trả lời được chấp nhận thì câu trả lời mới của bạn cần cung cấp một số thông tin mới đặc biệt. Nó không phải là rõ ràng rằng điều này không công việc. Nó không phải là rõ ràng lý do tại sao bạn đang ăn 'ls -l' vào 'awk'; cũng không rõ tại sao bạn đang sử dụng ':' làm phân tách trường. Câu hỏi nói rằng nó cần phải tổng hợp cột 2, vì vậy nó không phải là rõ ràng lý do tại sao bạn tổng cột 5. –

+0

làm thế nào để in tên tệp cùng một lúc? –

Các vấn đề liên quan