2010-06-26 68 views
23

Bất kỳ ai cũng biết cách tính giá trị trung bình của một cột này (trên Linux) ??Làm cách nào để tính giá trị trung bình của một cột

sda    2.91 20.44 6.13 2.95 217.53 186.67 44.55  0.84 92.97 
sda    0.00  0.00 2.00 0.00 80.00  0.00 40.00  0.22 110.00 
sda    0.00  0.00 2.00 0.00 144.00  0.00 72.00  0.71 100.00 
sda    0.00 64.00 0.00 1.00  0.00  8.00  8.00  2.63 10.00 
sda    0.00  1.84 0.31 1.38 22.09 104.29 74.91  3.39 2291.82 
sda    0.00  0.00 0.00 0.00  0.00  0.00  0.00  0.00 0.00 

Ví dụ: trung bình (cột 2)

+1

http://unix.stackexchange.com/questions/13731/is-there-a-way-to -get-the-min-max-trung bình-và-trung bình-of-a-danh sách-of-số-in –

Trả lời

52

AWK:

awk '{ total += $2 } END { print total/NR }' yourFile.whatever 

Đọc dưới dạng:

  • Đối với mỗi dòng, thêm cột 2 vào biến 'tổng'.
  • Ở cuối tệp, in 'tổng' chia cho số lượng bản ghi.
+0

... Hoặc bạn luôn có thể sử dụng AWK tất nhiên :) :) +1 – OscarRyz

+0

Tuyệt vời .. cảm ơn ... nó đơn giản và hoạt động thực sự tốt !! – Alucard

+0

@Porges: Cách truy cập các khoảng thời gian cụ thể: Cho phép nói trong cột thứ hai, tôi muốn tìm trung bình của các phần tử từ 2 đến 6? –

1

Bạn có thể sử dụng python cho rằng, hiện có sẵn trong Linux.

Nếu xuất phát từ tệp, hãy xem question này, chỉ cần sử dụng phao thay thế.

Ví dụ:

#mean.py 
def main(): 
    with open("mean.txt", 'r') as f: 
     data = [map(float, line.split()) for line in f] 

    columnTwo = [] 
    for row in data: 
     columnTwo.append(row[1]) 

    print sum(columnTwo,0.0)/len(columnTwo) 



if __name__=="__main__": 
    main() 

Prints 14,38

tôi chỉ bao gồm các dữ liệu trong file mean.txt, không phải là tiêu đề hàng: "sda"

+1

Suy nghĩ đầu tiên của tôi có lẽ sẽ có được Python là tốt ... nhưng làm cho danh sách có thể là quá kém hiệu quả ở đây, vì bạn chỉ thực sự cần số tiền và số dòng. (Ngoài ra, vì niềm vui của nó: 'với mở (" mean.txt ", 'r') là f: n, t = map (tổng, zip (* ((1, float (dòng.split() [1])) cho dòng trong f))); print t/n') –

0

David Zaslavsky cho những niềm vui của nó:

with open("mean.txt", 'r') as f: 
    n,t = map(sum, zip(*((1, float(line.split()[1])) for line in f))) 
print t/n 
0

Simple-r sẽ tính toán giá trị trung bình với dòng sau:

r -k2 mean file.txt 

cho cột thứ hai. Nó cũng có thể phân tích thống kê phức tạp hơn nhiều, vì nó sử dụng R environment cho tất cả các phân tích thống kê của nó.

3

Perl giải pháp:

perl -lane '$total += $F[1]; END{print $total/$.}' file 

-a autosplits dòng vào mảng @F, được lập chỉ mục bắt đầu từ 0
$. là số dòng

Nếu lĩnh vực của bạn được phân cách bằng dấu phẩy thay vì khoảng trắng:

perl -F, -lane '$total += $F[1]; END{print $total/$.}' file 

Để in có nghĩa là giá trị của tất cả các cột, chuyển nhượng tổng số vào mảng @t:

perl -lane 'for $c (0..$#F){$t[$c] += $F[$c]}; END{for $c (0..$#t){print $t[$c]/$.}}' 

đầu ra:

0 
0.485 
14.38 
1.74 
0.888333333333333 
77.27 
49.8266666666667 
39.91 
1.29833333333333 
434.131666666667 
Các vấn đề liên quan