免费注册 查看新帖 |

Chinaunix

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

awk 取同一时间中的最大值(在后面增加了新需求!) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-25 09:19 |只看该作者 |倒序浏览
本帖最后由 dmidecode 于 2011-03-27 19:56 编辑

目的:希望取每半小时中 $3 的最大值,
2011-03-22 00:00:39     2.49
2011-03-22 00:12:39     6
2011-03-22 00:24:39     2.22
2011-03-22 00:36:39     5.21
2011-03-22 00:48:39     2.02

希望取到 00:00:00 到 00:29:59  的最大值 6
希望取到 00:30:00 到 00:59:59  的最大值 5.21

具体文件内容如下:

2011-03-22 00:00:39     2.49
2011-03-22 00:12:39     6
2011-03-22 00:24:39     2.22
2011-03-22 00:36:39     5.21
2011-03-22 00:48:39     2.02
2011-03-22 01:00:39     2.74
2011-03-22 01:12:39     4.71
2011-03-22 01:24:39     3.26
2011-03-22 01:36:39     3.93
2011-03-22 01:48:39     2.24
2011-03-22 02:00:39     1.5
2011-03-22 02:12:39     5.04
2011-03-22 02:24:39     1.25
2011-03-22 02:36:39     2.24
2011-03-22 02:48:39     2.96
2011-03-22 03:00:39     1.25
2011-03-22 03:12:39     3.74
2011-03-22 03:24:39     1.75
2011-03-22 03:36:39     1.75
2011-03-22 03:48:39     3.75
2011-03-22 04:00:39     2.01

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-03-25 10:47 |只看该作者
目的:希望取每半小时中 $3 的最大值,
2011-03-22 00:00:39     2.49
2011-03-22 00:12:39     6
2011- ...
dmidecode 发表于 2011-03-25 09:19
  1. $ awk 'BEGIN{FS="[: \t]"}{i=int(($2*60+$3)/30);if(a[i] < tmp)a[i]=tmp}{tmp=$NF}END{for(i=0;;i++){if(i in a) printf "%0d:%0d:00~%0d:%0d:59\t%f\n",i*30/60,i*30%60,i*30/60,i*30%60+29,a[i];else break;}}' file1
  2. 0:0:00~0:29:59        6.000000
  3. 0:30:00~0:59:59        5.210000
  4. 1:0:00~1:29:59        4.710000
  5. 1:30:00~1:59:59        3.930000
  6. 2:0:00~2:29:59        5.040000
  7. 2:30:00~2:59:59        2.240000
  8. 3:0:00~3:29:59        3.740000
  9. 3:30:00~3:59:59        1.750000
  10. 4:0:00~4:29:59        3.750000
复制代码
好像最后一行出现了一点小问题。

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
3 [报告]
发表于 2011-03-25 10:55 |只看该作者
只有一天的吗 不用该考虑日期的比较吗
有可能半个小时没有一个记录吗

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2011-03-25 11:28 |只看该作者
只有一天的吗 不用该考虑日期的比较吗
有可能半个小时没有一个记录吗
ziyunfei 发表于 2011-03-25 10:55
他的记录很有规律啊。应该是crontab中生成的。

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
5 [报告]
发表于 2011-03-25 11:33 |只看该作者
awk 'BEGIN{"date +%s -d \"2011-03-22 00:00:00\""|getline start}{if(mktime(gensub(/-|:/," ","g",$1" "$2))-1800>start){printf strftime("%F %T",start);start+=1800;print "=>"strftime("%F %T",start),a;a=0;}if(a<$3){a=$3}}END{printf strftime("%F %T",start);start+=1800;print "=>"strftime("%F %T",start),a;}' a.txt

2011-03-22 00:00:00=>2011-03-22 00:30:00 6
2011-03-22 00:30:00=>2011-03-22 01:00:00 5.21
2011-03-22 01:00:00=>2011-03-22 01:30:00 4.71
2011-03-22 01:30:00=>2011-03-22 02:00:00 3.93
2011-03-22 02:00:00=>2011-03-22 02:30:00 5.04
2011-03-22 02:30:00=>2011-03-22 03:00:00 2.96
2011-03-22 03:00:00=>2011-03-22 03:30:00 3.74
2011-03-22 03:30:00=>2011-03-22 04:00:00 3.75
2011-03-22 04:00:00=>2011-03-22 04:30:00 2.01

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2011-03-25 11:57 |只看该作者
数据是有规律的
按照:3行,2行,3行。。。分布,这样大概好处理,也能减少运算。
还没想出简洁的办法

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
7 [报告]
发表于 2011-03-25 11:59 |只看该作者
回复 6# 昭襄王


    阁下真是聪明啊,平均12分钟执行一次,的确是3+2,这个问题可以扩展一下,考虑跨日,月,年的问题。

论坛徽章:
0
8 [报告]
发表于 2011-03-25 12:22 |只看该作者
本帖最后由 ywlscpl 于 2011-03-25 12:23 编辑

同一天
  1. awk '{split($2,n,":");s=60*60*n[1]+60*n[2]+n[3];m=int(s/1800);a[m]=a[m]<$3?$3:a[m]}END{for (i in a) printf "%02d:%02d:00-%02d:%02d:59 %s\n",int(i/2),(i-int(i/2)*2)*30,int(((i+1)*1800-1)/3600),int(((i+1)*1800-1-int(((i+1)*1800-1)/3600)*3600)/60),a[i]|"sort"}' file
复制代码
  1. ywlscpl@ubuntu:~$ awk '{split($2,n,":");s=60*60*n[1]+60*n[2]+n[3];m=int(s/1800);a[m]=a[m]<$3?$3:a[m]}END{for (i in a) printf "%02d:%02d:00-%02d:%02d:59 %s\n",int(i/2),(i-int(i/2)*2)*30,int(((i+1)*1800-1)/3600),int(((i+1)*1800-1-int(((i+1)*1800-1)/3600)*3600)/60),a[i]|"sort"}' file
  2. 00:00:00-00:29:59 6
  3. 00:30:00-00:59:59 5.21
  4. 01:00:00-01:29:59 4.71
  5. 01:30:00-01:59:59 3.93
  6. 02:00:00-02:29:59 5.04
  7. 02:30:00-02:59:59 2.96
  8. 03:00:00-03:29:59 3.74
  9. 03:30:00-03:59:59 3.75
  10. 04:00:00-04:29:59 2.01
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-03-25 12:32 |只看该作者
日期不同
  1. ywlscpl@ubuntu:~$ cat file
  2. 2011-03-19 00:00:39     1.49
  3. 2011-03-21 00:00:39     2.49
  4. 2011-03-22 00:12:39     6
  5. 2011-03-22 00:24:39     2.22
  6. 2011-03-22 00:36:39     5.21
  7. 2011-03-22 00:48:39     2.02
  8. 2011-03-22 01:00:39     2.74
  9. 2011-03-22 01:12:39     4.71
  10. 2011-03-22 01:24:39     3.26
  11. 2011-03-22 01:36:39     3.93
  12. 2011-03-22 01:48:39     2.24
  13. 2011-03-22 02:00:39     1.5
  14. 2011-03-22 02:12:39     5.04
  15. 2011-03-22 02:24:39     1.25
  16. 2011-03-22 02:36:39     2.24
  17. 2011-03-22 02:48:39     2.96
  18. 2011-03-22 03:00:39     1.25
  19. 2011-03-22 03:12:39     3.74
  20. 2011-03-22 03:24:39     1.75
  21. 2011-03-22 03:36:39     1.75
  22. 2011-03-22 03:48:39     3.75
  23. 2011-03-22 04:00:39     2.01
  24. ywlscpl@ubuntu:~$ awk '{split($2,n,":");s=60*60*n[1]+60*n[2]+n[3];m=int(s/1800);a[$1","m]=a[$1","m]<$3?$3:a[$1","m]}END{for (i in a) {split(i,m1,",");printf "%s %02d:%02d:00-%02d:%02d:59 %s\n",m1[1],int(m1[2]/2),(m1[2]-int(m1[2]/2)*2)*30,int(((m1[2]+1)*1800-1)/3600),int(((m1[2]+1)*1800-1-int(((m1[2]+1)*1800-1)/3600)*3600)/60),a[i]|"sort"}}' file
  25. 2011-03-19 00:00:00-00:29:59 1.49
  26. 2011-03-21 00:00:00-00:29:59 2.49
  27. 2011-03-22 00:00:00-00:29:59 6
  28. 2011-03-22 00:30:00-00:59:59 5.21
  29. 2011-03-22 01:00:00-01:29:59 4.71
  30. 2011-03-22 01:30:00-01:59:59 3.93
  31. 2011-03-22 02:00:00-02:29:59 5.04
  32. 2011-03-22 02:30:00-02:59:59 2.96
  33. 2011-03-22 03:00:00-03:29:59 3.74
  34. 2011-03-22 03:30:00-03:59:59 3.75
  35. 2011-03-22 04:00:00-04:29:59 2.01
复制代码

论坛徽章:
0
10 [报告]
发表于 2011-03-25 14:04 |只看该作者
本帖最后由 springwind426 于 2011-03-25 14:07 编辑
  1. awk -F '[ :]+' '{k=sprintf(($3<30)?"%s %s:00:00~%s:29:59":"%s %s:30:00~%s:59:59",$1,$2,$2);a[k]=(a[k]<$5)?$5:a[k];}END{for(i in a)printf "%s\t%s\n",i,a[i]}' data1 | sort
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP