2013-02-26 276 views
2

我已看起來像這樣,例如數據:計算平均

Flats 2b 
01/1991, 3.45 
01/1992, 4.56 
01/1993, 4.21 
01/1994, 5.21 
01/1995, 7.09 
01/2013, 6.80 
Eagle 2 
01/1991, 4.22 
01/1992, 6.32 
01/1993, 5.21 
01/1994, 8.09 
01/1995, 7.92 
01/2013, 6.33 

我試圖計算塔2,使平均,我期望的輸出是這樣的,優選:

Flats 2b 
Avg = 4.67 
Eagle 2 
Avg = 5.26 

,甚至看起來像這樣無頭簡單: 平均= 4.67 平均= 5.26

等等... SI輸入文件中充滿了許多包含上述數據的標題。

我試圖做模式匹配的選擇和使用NR像這樣的東西沒有成功作爲一個awk一行代碼:

awk '/01/1991,/01/1993 {sum+=$2; cnt+=1} {print "Avg =" sum/cnt}' myfile.txt 

我得到的平均值,但不是我想要的只是歲月1991年,1992年平均和1993年分別爲每個會議塔。
非常感謝您的幫助!

回答

1

如果你想只考慮幾年1991-1993

#! /usr/bin/awk -f 

# new header, print average if exists, reset values 
/[a-zA-Z]/ { 
    if (cnt > 0) { 
     print header; 
     printf("Avg = %.2f\n", sum/cnt); 
    } 
    header=$0; sum=0; cnt=0; 
} 

# calculate average 
/^01\/199[123]/ { sum+=$2; cnt++; } 

# print last average 
END { 
    if (cnt > 0) { 
     print header; 
     printf("Avg = %.2f\n", sum/cnt); 
    } 
} 

這看起來對awk腳本查找頭,打印一個平均值,如果有的話,然後重置下一個平均計算的所有變量。如果它找到一個數據行,它將在稍後計算平均所需的總和。如果讀取最後一行,則打印最終的平均值。

該劇本僅考慮1991年至1993年的情況。如果您想要包含更多年,您可以重複計算行或使用或操作||

# calculate average 
/^01\/199[0-9]/ || /^01\/200[0-9]/ { sum+=$2; cnt++; } 

添加多個年這需要所有20世紀90年代和21世紀初考慮。

如果您不想打印標題,請刪除相應的行print header

你叫這個awk腳本作爲

awk -f script.awk myfile.txt 
+0

感謝,但我增加了一些修改,以幫助我認爲一個解決方案。 – user2100039 2013-02-26 18:31:14

+0

@ user2100039我更新了腳本,請參閱,如果它符合您的需要。 – 2013-02-26 18:42:02

+0

你好,謝謝。我如何執行此操作? ./yourscript myfile ...?我得到一個錯誤行5/[a-zA-Z] /:沒有這樣的文件或目錄和語法錯誤在第6行附近意外的標記'{',並且在第6行if(cnt> 0){' – user2100039 2013-02-26 19:20:18