簡體   English   中英

使用awk按小時(行)列的平均值

[英]Average of column by hours (rows) using awk

我在文件中有以下行,我希望按小時獲得第3列的平均值。

2010-10-28 12:02:36: 5.1721851 secs
2010-10-28 12:03:43: 4.4692638 secs
2010-10-28 12:04:51: 3.3770310 secs
2010-10-28 12:05:58: 4.6227063 secs
2010-10-28 12:07:08: 5.1650404 secs
2010-10-28 12:08:16: 3.2819025 secs

2010-10-28 13:01:36: 2.1721851 secs
2010-10-28 13:02:43: 3.4692638 secs
2010-10-28 13:03:51: 4.3770310 secs
2010-10-28 13:04:58: 3.6227063 secs
2010-10-28 13:05:08: 3.1650404 secs
2010-10-28 13:06:16: 4.2819025 secs

2010-10-28 14:12:36: 7.1721851 secs
2010-10-28 14:23:43: 7.4692638 secs
2010-10-28 14:24:51: 7.3770310 secs
2010-10-28 14:25:58: 9.6227063 secs
2010-10-28 14:37:08: 7.1650404 secs
2010-10-28 14:48:16: 7.2819025 secs

我已經做好了

cat filename | awk '{sum+=$3} END {print "Average = ",sum/NR}'

與輸出

Average =  4.49154

獲取整個文件的平均值,但希望按小時打破平均值。 我可以在輸出到awk之前的一小時偷偷摸摸一下grep,但是我希望,用一個襯墊來做它。

理想情況下,輸出就像是

Average 12:00 = _computed_avg_
Average 13:00 = _computed_avg_
Average 14:00 = _computed_avg_

等等。

不一定要尋找答案,但希望能指出正確的方向。

我將字段分隔符設置為冒號,然后在數組中的不同鍵的關聯數組中聚合,最后計算平均值:

gawk -F: 'NF == 4 { sum[$1] += $4; N[$1]++ } 
          END     { for (key in sum) {
                        avg = sum[key] / N[key];
                        printf "%s %f\n", key, avg;
                    } }' filename | sort

在您的測試數據上,這給出:

2010-10-28 12 4.348022
2010-10-28 13 3.514688
2010-10-28 14 7.681355

即使數據不按時間順序(假設你不按順序連接兩個日志文件),這應該產生正確的答案。 請注意,gawk將以數字方式匯總“3.123秒”值。 最后的排序按時間順序顯示平均值; 無法保證按時間順序打印按鍵。

Awk具有關聯數組,因此您可以按小時存儲平均值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM