- 论坛徽章:
- 0
|
本帖最后由 helpid 于 2012-08-27 13:28 编辑
大家好,今天在统计数据时遇到一个难点问题,希望各位能帮助解决!谢谢!
部分原始数据:- 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
复制代码 第一步已经实现了对原始数据每分钟最大值、最小值、平均值的统计。我把第一次统计后的数据列出来:- 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
复制代码 $1: 时间, $2: 分钟最大值, $3: 分钟最小值, $4: 分钟平均值
以上数据通过如下方式实现的:- #!/bin/sh
- srcpath=./src/
- despath=./des/
- for file in $(ls -1 -F ${srcpath} | grep -v [/$]);do
- # 第一步:处理原始数据
- # 通过substr来截取时间字段的[小时:分钟]
- # 处理后的数据格式为 time max min arg ;共4个字段
- # 最后把统计后的数据保存至目标临时文件
- # 听取群里面各位同学的建议,使用了三元运算符
- 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
复制代码 说明:把以上数据做个累计最大值和累计最小值统计。
初始化统计的时候,累计最值和每分钟最值是一样的.
要求输出如下格式数据:- 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
复制代码 其中:
$1: 时间, $2: 分钟最大值, $3: 分钟最小值, $4: 分钟平均值, $5:累计最大值, $6:累计最小值
说明:
1、从原始数据可以看出 "09:19 3297.80 3296.00 3296.8" 这条数据是第一条数据,所以统计初始化时,
第一条数据的累计最大值=第一条数据的分钟最大值= 3297.80; 第一条数据的累计最小值=第一条数据的分钟最小值=3296.00;
2、从09:20~09:21 两条数据可以看出09:20的分钟最大值为3297.80 【小于】 09:21的分钟最大值为3299.00,所以09:21的累计最大值被刷新,新的累计最大值为3299.00
3、从09:20~09:21 两条数据可以看出09:20的分钟最小值为3296.00 【小于】 09:21的分钟最小值为3296.60,所以09:21的累计最小值保持不变,不会被刷新,依然是3296.00
就是说:除第一条数据的累计最大值与分钟最大值保持一致, 累计最小值与分钟最小值保持一致 以外,其他数据的累计最大值和累计最小值都有可能刷新。
如果上一条数据的累计最大值【小于】当前数据的分钟最大值,则累计最大值被刷新,否则累计最大值保持不变,不会被刷新
如果上一条数据的累计最小值【大于】当前数据的分钟最小值,则累计最小值被刷新,否则累计最小值保持不变,不会被刷新
题外话:实际上我是想通过一个awk来实现统计分钟最大值、分钟最小值、分钟平均值、累计最大值、累计最小值的。
但目前还没有好的思路,如您有好的想法,希望分享下~~
|
|