免费注册 查看新帖 |

Chinaunix

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

能给出一个计算时间差和匹配某个字段的shell吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-20 11:12 |只看该作者 |倒序浏览
一个文件如test.txt,格式如下:
a,b,c,20051201180903,20051201180912,d,e,21/122,21
a,b,c,20051201180903,20051201180912,d,e,f,21/121,21,22
a,b,c,20051201180903,20051201180912,d,e,f,g,21/121,21,22,23
其中第4列和第5列都是时间,格式为YYYYMMDDHHMMSS,需要提取第5列减第4列差为大于60s,并且包含21/121的列,请问这个shell该如何写?
wayy2008 该用户已被删除
2 [报告]
发表于 2005-12-20 11:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2005-12-20 11:36 |只看该作者
如果第5列减去第4列为大于20s的,那如何判断呢?谢谢!

论坛徽章:
0
4 [报告]
发表于 2005-12-20 13:25 |只看该作者
原帖由 lqiao 于 2005-12-20 11:36 发表
如果第5列减去第4列为大于20s的,那如何判断呢?谢谢!

基础12中的awk篇幅中应该有讲的

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-12-20 14:05 |只看该作者
  1. awk -F, '$0~/21\/122/{a=substr($4,1,4)" "substr($4,5,2)" "substr($4,7,2)" "substr($4,9,2)" "substr($4,11,2)" "substr($4,13,2);b=mktime(a);aa=substr($5,1,4)" "substr($5,5,2)" "substr($5,7,2)" "substr($5,9,2)" "substr($5,11,2)" "substr($5,13,2);bb=mktime(aa);cc=bb-b;if (cc>20)print}' file
复制代码


谁给个简化的

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-12-20 14:11 |只看该作者
思路简单,解决起来比较繁琐

论坛徽章:
0
7 [报告]
发表于 2005-12-20 14:11 |只看该作者
原帖由 mocou 于 2005-12-20 14:05 发表
  1. awk -F, '$0~/21\/122/{a=substr($4,1,4)" "substr($4,5,2)" "substr($4,7,2)" "substr($4,9,2)" "substr($4,11,2)" "substr($4,13,2);b=mktime(a);aa= ...
复制代码


域分割符号怎么不取大点?



  1. -F ",200512011"
复制代码


如何?或者更长点?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2005-12-20 14:12 |只看该作者
  1. gawk -F , '/21\/121/{a=$4;b=$5;gsub(/../,"& ",a);
  2. gsub(/../,"& ",b);
  3. sub(/ /,"",a);
  4. sub(/ $/,"",a);
  5. sub(/ /,"",b);
  6. sub(/ $/,"",b);
  7. if(mktime(b)-mktime(a)>60)print} ' file
复制代码


如果你要求的差值都是xxs的话(注意,如果要求的差值大于小时的话,结果是什么俺没想)

  1. awk -F , '/21\/121/&&(substr($5,1,12)-substr($4,1,12))*60+(substr($5,13,2)-substr($4,13,2))>60 ' file
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-12-20 14:17 |只看该作者
原帖由 mocou 于 2005-12-20 14:05 发表
[code]awk -F, '$0~/21\/122/{a=substr($4,1,4)" "substr($4,5,2)" "substr($4,7,2)" "substr($4,9,2)" "substr($4,11,2)" "substr($4,13,2);b=mktime(a);aa= ...

汗,,,,,, :em11:

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-12-20 14:26 |只看该作者
/home/lee#cat txt
a,b,c,20051201180603,20051201180912,d,e,21/122,21
a,b,c,20051201180902,20051201180913,d,e,f,21/121,21,22
a,b,c,20051201180904,20051201180914,d,e,f,g,21/121,21,22,23

  1. /home/lee#cat f
  2. #!/bin/bash
  3. ifs=$IFS
  4. IFS=','
  5. while read line;do
  6. set -- $line
  7. a=$(date +%s -d"${4:0:8} ${4:8:2}:${4:10:2}:${4:12:2}")
  8. b=$(date +%s -d"${5:0:8} ${5:8:2}:${5:10:2}:${5:12:2}")
  9. c=$((b-a))
  10. echo $@ $c
  11. done<txt|awk '$NF>60&&/21\/122/{gsub(/ /,",");sub(/,([0-9])+$/,"");print}'
复制代码
result
/home/lee#sh f
a,b,c,20051201180603,20051201180912,d,e,21/122,21
/home/lee#
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP