- 論壇徽章:
- 0
|
本帖最后由 helpid 于 2012-08-27 13:28 編輯
大家好,今天在統(tǒng)計數(shù)據(jù)時遇到一個難點問題,希望各位能幫助解決!謝謝!
部分原始數(shù)據(jù):- 09:14:00.500 3279.20 5 3279.80 29 3279.80 73 28715
- 09:15:00.500 3279.00 14 3279.80 9 3279.80 134 28723
- 09:15:01.0 3279.00 11 3279.20 24 3279.20 155 28721
- 09:15:01.500 3279.00 3 3279.20 15 3279.20 172 28715
- 09:15:02.0 3278.20 7 3278.80 7 3279.20 190 28719
- 09:15:02.500 3278.20 2 3278.60 1 3278.80 205 28721
- 09:15:03.0 3278.40 1 3278.60 25 3278.60 215 28727
- 09:15:03.500 3278.00 88 3278.60 13 3278.60 236 28729
- 09:15:04.0 3278.00 88 3278.40 12 3278.20 239 28728
- 09:15:04.500 3278.20 2 3278.40 12 3278.20 255 28724
- 09:15:05.0 3278.00 78 3278.20 1 3278.00 268 28724
- 09:15:05.500 3278.00 71 3278.40 10 3278.20 279 28726
- 09:15:06.0 3278.00 65 3278.20 14 3278.00 288 28726
- 09:15:06.500 3278.00 58 3278.20 16 3278.00 295 28722
- 09:15:07.0 3278.00 48 3278.20 5 3278.20 317 28728
- 09:15:07.500 3278.00 44 3278.40 8 3278.00 337 28733
- 09:15:08.0 3278.00 39 3278.40 8 3278.00 344 28727
- 09:15:08.500 3278.20 1 3278.40 7 3278.20 351 28729
- 09:15:09.0 3278.20 1 3278.40 5 3278.20 361 28726
- 09:15:09.500 3278.00 29 3278.40 4 3278.20 368 28726
復(fù)制代碼 第一步已經(jīng)實現(xiàn)了對原始數(shù)據(jù)每分鐘最大值、最小值、平均值的統(tǒng)計。我把第一次統(tǒng)計后的數(shù)據(jù)列出來:- 09:19 3297.80 3296.00 3296.8
- 09:20 3299.00 3296.60 3297.8
- 09:21 3298.40 3296.20 3296.9
- 09:22 3299.80 3297.20 3298.4
- 09:23 3299.20 3296.20 3298.3
- 09:24 3299.00 3297.20 3298.1
復(fù)制代碼 $1: 時間, $2: 分鐘最大值, $3: 分鐘最小值, $4: 分鐘平均值
以上數(shù)據(jù)通過如下方式實現(xiàn)的:- #!/bin/sh
- srcpath=./src/
- despath=./des/
- for file in $(ls -1 -F ${srcpath} | grep -v [/$]);do
- # 第一步:處理原始數(shù)據(jù)
- # 通過substr來截取時間字段的[小時:分鐘]
- # 處理后的數(shù)據(jù)格式為 time max min arg ;共4個字段
- # 最后把統(tǒng)計后的數(shù)據(jù)保存至目標臨時文件
- # 聽取群里面各位同學(xué)的建議,使用了三元運算符
- awk '{
- time=substr($1,1,5)
- count[time]++
- max[time]=$6>max[time]?$6:max[time]
- min[time]=(!length(min[time])||$6<min[time])?$6:min[time]
- sum[time]+=$6
- }
- END{
- for(i in count) {
- print i,max[i],min[i],sum[i]/count[i]
- }
- }' ${srcpath}${file}|sort> ${despath}${file}_tmp
- done
復(fù)制代碼 說明:把以上數(shù)據(jù)做個累計最大值和累計最小值統(tǒng)計。
初始化統(tǒng)計的時候,累計最值和每分鐘最值是一樣的.
要求輸出如下格式數(shù)據(jù):- 09:19 3297.80 3296.00 3296.8 3297.80 3296.00
- 09:20 3299.00 3296.60 3297.8 3299.00 3296.00
- 09:21 3298.40 3296.20 3296.9 3299.00 3296.00
- 09:22 3299.80 3297.20 3298.4 3299.80 3296.00
- 09:23 3299.20 3296.20 3298.3 3299.80 3296.00
- 09:24 3299.00 3297.20 3298.1 3299.80 3296.00
復(fù)制代碼 其中:
$1: 時間, $2: 分鐘最大值, $3: 分鐘最小值, $4: 分鐘平均值, $5:累計最大值, $6:累計最小值
說明:
1、從原始數(shù)據(jù)可以看出 "09:19 3297.80 3296.00 3296.8" 這條數(shù)據(jù)是第一條數(shù)據(jù),所以統(tǒng)計初始化時,
第一條數(shù)據(jù)的累計最大值=第一條數(shù)據(jù)的分鐘最大值= 3297.80; 第一條數(shù)據(jù)的累計最小值=第一條數(shù)據(jù)的分鐘最小值=3296.00;
2、從09:20~09:21 兩條數(shù)據(jù)可以看出09:20的分鐘最大值為3297.80 【小于】 09:21的分鐘最大值為3299.00,所以09:21的累計最大值被刷新,新的累計最大值為3299.00
3、從09:20~09:21 兩條數(shù)據(jù)可以看出09:20的分鐘最小值為3296.00 【小于】 09:21的分鐘最小值為3296.60,所以09:21的累計最小值保持不變,不會被刷新,依然是3296.00
就是說:除第一條數(shù)據(jù)的累計最大值與分鐘最大值保持一致, 累計最小值與分鐘最小值保持一致 以外,其他數(shù)據(jù)的累計最大值和累計最小值都有可能刷新。
如果上一條數(shù)據(jù)的累計最大值【小于】當前數(shù)據(jù)的分鐘最大值,則累計最大值被刷新,否則累計最大值保持不變,不會被刷新
如果上一條數(shù)據(jù)的累計最小值【大于】當前數(shù)據(jù)的分鐘最小值,則累計最小值被刷新,否則累計最小值保持不變,不會被刷新
題外話:實際上我是想通過一個awk來實現(xiàn)統(tǒng)計分鐘最大值、分鐘最小值、分鐘平均值、累計最大值、累計最小值的。
但目前還沒有好的思路,如您有好的想法,希望分享下~~
|
|