免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3993 | 回复: 5
打印 上一主题 下一主题

[文本处理] awk 统计累计最大值、累计最小值 求助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-27 00:01 |只看该作者 |倒序浏览
本帖最后由 helpid 于 2012-08-27 13:28 编辑

大家好,今天在统计数据时遇到一个难点问题,希望各位能帮助解决!谢谢!

部分原始数据:
  1. 09:14:00.500        3279.20        5        3279.80         29                3279.80        73        28715
  2. 09:15:00.500        3279.00        14        3279.80         9                3279.80        134        28723
  3. 09:15:01.0        3279.00        11        3279.20         24                3279.20        155        28721
  4. 09:15:01.500        3279.00        3        3279.20         15                3279.20        172        28715
  5. 09:15:02.0        3278.20        7        3278.80         7                3279.20        190        28719
  6. 09:15:02.500        3278.20        2        3278.60         1                3278.80        205        28721
  7. 09:15:03.0        3278.40        1        3278.60         25                3278.60        215        28727
  8. 09:15:03.500        3278.00        88        3278.60         13                3278.60        236        28729
  9. 09:15:04.0        3278.00        88        3278.40         12                3278.20        239        28728
  10. 09:15:04.500        3278.20        2        3278.40         12                3278.20        255        28724
  11. 09:15:05.0        3278.00        78        3278.20         1                3278.00        268        28724
  12. 09:15:05.500        3278.00        71        3278.40         10                3278.20        279        28726
  13. 09:15:06.0        3278.00        65        3278.20         14                3278.00        288        28726
  14. 09:15:06.500        3278.00        58        3278.20         16                3278.00        295        28722
  15. 09:15:07.0        3278.00        48        3278.20         5                3278.20        317        28728
  16. 09:15:07.500        3278.00        44        3278.40         8                3278.00        337        28733
  17. 09:15:08.0        3278.00        39        3278.40         8                3278.00        344        28727
  18. 09:15:08.500        3278.20        1        3278.40         7                3278.20        351        28729
  19. 09:15:09.0        3278.20        1        3278.40         5                3278.20        361        28726
  20. 09:15:09.500        3278.00        29        3278.40         4                3278.20        368        28726
复制代码
第一步已经实现了对原始数据每分钟最大值、最小值、平均值的统计。我把第一次统计后的数据列出来:
  1. 09:19  3297.80  3296.00  3296.8
  2. 09:20  3299.00  3296.60  3297.8
  3. 09:21  3298.40  3296.20  3296.9
  4. 09:22  3299.80  3297.20  3298.4
  5. 09:23  3299.20  3296.20  3298.3
  6. 09:24  3299.00  3297.20  3298.1
复制代码
$1: 时间, $2: 分钟最大值, $3: 分钟最小值, $4: 分钟平均值

以上数据通过如下方式实现的:
  1. #!/bin/sh
  2. srcpath=./src/
  3. despath=./des/
  4. for file in $(ls -1 -F ${srcpath} | grep -v [/$]);do
  5. # 第一步:处理原始数据
  6. # 通过substr来截取时间字段的[小时:分钟]
  7. # 处理后的数据格式为  time max min arg ;共4个字段
  8. # 最后把统计后的数据保存至目标临时文件
  9. # 听取群里面各位同学的建议,使用了三元运算符
  10. awk '{
  11.                 time=substr($1,1,5)
  12.                 count[time]++
  13.                 max[time]=$6>max[time]?$6:max[time]
  14.                 min[time]=(!length(min[time])||$6<min[time])?$6:min[time]
  15.                 sum[time]+=$6
  16.         }
  17.         END{
  18.                 for(i in count) {
  19.                         print i,max[i],min[i],sum[i]/count[i]
  20.                 }
  21.         }' ${srcpath}${file}|sort> ${despath}${file}_tmp
  22. done
复制代码
说明:把以上数据做个累计最大值和累计最小值统计。
初始化统计的时候,累计最值和每分钟最值是一样的.
要求输出如下格式数据:
  1. 09:19  3297.80  3296.00  3296.8  3297.80  3296.00
  2. 09:20  3299.00  3296.60  3297.8  3299.00  3296.00
  3. 09:21  3298.40  3296.20  3296.9  3299.00  3296.00
  4. 09:22  3299.80  3297.20  3298.4  3299.80  3296.00
  5. 09:23  3299.20  3296.20  3298.3  3299.80  3296.00
  6. 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来实现统计分钟最大值、分钟最小值、分钟平均值、累计最大值、累计最小值的。
但目前还没有好的思路,如您有好的想法,希望分享下~~


论坛徽章:
0
2 [报告]
发表于 2012-08-27 08:39 |只看该作者
回复 1# helpid
  1. personball@vostro:SHELL$awk 'BEGIN{max=0;min=9999;}$2>max{max=$2}$3<min{min=$3}{print $0 FS max FS min}' file
  2. 09:19  3297.80  3296.00  3296.8 3297.80 3296.00
  3. 09:20  3299.00  3296.60  3297.8 3299.00 3296.00
  4. 09:21  3298.40  3296.20  3296.9 3299.00 3296.00
  5. 09:22  3299.80  3297.20  3298.4 3299.80 3296.00
  6. 09:23  3299.20  3296.20  3298.3 3299.80 3296.00
  7. 09:24  3299.00  3297.20  3298.1 3299.80 3296.00
  8. personball@vostro:SHELL$
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-08-27 12:56 |只看该作者
回复 2# personball


    谢谢您的解答!

论坛徽章:
0
4 [报告]
发表于 2012-08-27 13:06 |只看该作者
以下是群里面winway给出的方法:
  1. awk 'NR==1{max=$2;min=$3}{max=max<$2?$2:max;min=min>$3?$3:min;$5=max;$6=min}1' file
复制代码
下面是完整的脚本:
#awk 统计最大值、最小值、平均值、累计最大值、累计最小值
  1. #!/bin/sh
  2. srcpath=./src/
  3. despath=./des/
  4. for file in $(ls -1 -F ${srcpath} | grep -v [/$]);do
  5. # 第一步:处理原始数据
  6. # 通过substr来截取时间字段的[小时:分钟]
  7. # 处理后的数据格式为  time max min arg ;共4个字段
  8. # 最后把统计后的数据保存至目标临时文件
  9. # 听取群里面各位同学的建议,使用了三元运算符
  10. awk '{
  11.                 time=substr($1,1,5)
  12.                 count[time]++
  13.                 max[time]=($6>max[time])?$6:max[time]
  14.                 min[time]=(!length(min[time])||$6<min[time])?$6:min[time]
  15.                 sum[time]+=$6
  16.         }
  17.         END{
  18.                 for(i in count) {
  19.                         print i,max[i],min[i],sum[i]/count[i]
  20.                 }
  21.         }' ${srcpath}${file}|sort> ${despath}${file}_tmp

  22. # 第二步:进一步处理统计后的数据,统计出累计最大值和累计最小值
  23. # 这里加上了标题
  24. # 处理后的数据格式为  time max min arg amax amin ;共6个字段
  25. # 最后把统计后的数据保存至目标文件,并删除临时文件
  26. # 听取群里面各位同学的建议,使用了三元运算符
  27. awk 'BEGIN{
  28.                 print "=Time= =Max= =Min= =Arg= =AMax= =AMin="
  29.         }
  30.         NR==1{
  31.                 amax=$2
  32.                 amin=$3
  33.         }{
  34.                 amax=amax<$2?$2:amax
  35.                 amin=amin>$3?$3:amin
  36.                 $5=amax
  37.                 $6=amin
  38.         }1' ${despath}${file}_tmp|column -t > ${despath}${file} && \
  39.         rm -rf ${despath}${file}_tmp
  40. done
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2012-08-27 14:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2012-08-27 15:07 |只看该作者
回复 5# zooyo


    我还得跟zooyo多多学习呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP