2010-07-10 84 views
0

我有從日誌條目的列表:如何根據時間戳將記錄分組到桶中?

15:38:52.363 1031 
15:41:06.347 1259 
15:41:06.597 1171 
15:48:44.115 1588 
15:48:44.125 1366 
15:48:44.125 1132 
15:53:14.525 1348 
15:53:15.121 1553 
15:53:15.181 1286 
15:53:15.187 1293 

第一個是時間戳,第二個是值。

現在我試圖將它們分成20秒的時間間隔。我想要總結這些值,或者得到它們的平均值。我不知道最簡單的方法是什麼?最好我可以通過一些簡單的shell腳本來做到這一點,所以我可以將我的grep語句放入並獲得一個劃分的列表。謝謝!

回答

1

這個gawk腳本完全忽略小數秒。它還一無所知從一開始就跨越到下一個(交叉00:00:00):

grep ... | awk -v interval=20 'function groupout() {print "----", "Timespan ending:", strftime("%T", prevtime), "Sum:", sum, "Avg:", sum/count, "----"} BEGIN {prevtime = 0} {split($1, a, "[:.]"); time = mktime(strftime("%Y %m %d") " " a[1] " " a[2] " " a[3]); if (time > prevtime + interval) {if (NR != 1) {groupout(); sum=0; count=0}}; print; sum+=$2; count++; prevtime = time} END {groupout()}' 

輸出:

15:38:52.363 1031 
---- Timespan ending: 15:38:52 Sum: 1031 Avg: 1031 ---- 
15:41:06.347 1259 
15:41:06.597 1171 
---- Timespan ending: 15:41:06 Sum: 2430 Avg: 1215 ---- 
15:48:44.115 1588 
15:48:44.125 1366 
15:48:44.125 1132 
---- Timespan ending: 15:48:44 Sum: 4086 Avg: 1362 ---- 
15:53:14.525 1348 
15:53:15.121 1553 
15:53:15.181 1286 
15:53:15.187 1293 
---- Timespan ending: 15:53:15 Sum: 5480 Avg: 1370 ---- 

這又是其可讀性:

awk -v interval=20 ' 
function groupout() { 
    print "----", "Timespan ending:", strftime("%T", prevtime), "Sum:", sum, "Avg:", sum/count, "----" 
} 
BEGIN { 
    prevtime = 0 
} 
{ 
    split($1, a, "[:.]"); 
    time = mktime(strftime("%Y %m %d") " " a[1] " " a[2] " " a[3]); 
    if (time > prevtime + interval) { 
     if (NR != 1) {groupout(); sum=0; count=0} 
    }; 
    print; 
    sum+=$2; 
    count++; 
    prevtime = time 
} 
END {groupout()}' 
相關問題