免费注册 查看新帖 |

Chinaunix

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

用脚本来修改时间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-26 23:31 |只看该作者 |倒序浏览
现在有几个文件的,里面包含好几个字段,其中一个字段是时间,格式是:年月日时分秒.例如:20080621101212  .现在发现这个时间错了,比实际的时间晚了,5小时,27分,50秒.请问可以怎样写个AWK的脚本,把时间修改过来呢?该字段是用分隔符号 ";" , 把字段分开的,固定在第6个字段.其实就是不知道如何实现秒和分的进位,.麻烦高手帮帮忙,谢谢!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-06-26 23:53 |只看该作者
我的思路,把20080621101212兑为秒数
加上5*3600+27*60+50
然后再兑回去

论坛徽章:
0
3 [报告]
发表于 2008-06-27 01:14 |只看该作者
如果是gnu date的话可以用date -d转换
转换回去的话比较麻烦,要用perl:perl -pe "s/(\d+)/localtime($1)/"

论坛徽章:
0
4 [报告]
发表于 2008-06-27 08:32 |只看该作者

  1. gawk '{
  2. d=gensub(/(..)/,"\\1 ","g",$6);
  3. sub(/ /,"",d);
  4. d=mktime(d)-(5*3600+27*60+50);
  5. $6=strftime("%Y%m%d%H%M%S",d);
  6. print;
  7. }'  数据文件
复制代码


注:需要用gnuawk,因为需要用到gnuawk特有的函数。

解释:
gensub 就是把时间字符串每两个字符中间添加一个空格,gensub是gnuawk的特定函数
sub  把被拆分的年份合并
mktime 把时间换算成timestamp  时间格式是 "YYYY mm dd HH MM SS" 这个是gnuawk的特定函数
因为时间晚了,所以要-(5*3600+27*60+50)
$6=strftime("%Y%m%d%H%M%S",d)  还把timestamp转换成YYYYmmddHHMMSS的格式,strftime也是gnuawk的特定函数

[ 本帖最后由 springwind426 于 2008-6-27 08:39 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2008-06-27 10:35 |只看该作者

回复 #4 springwind426 的帖子

学习了。
如何将一个含有空格的awk变量(如 errdate="20060621 10:21:12" )作为系统命令(如date)的一个参数,从而构成命令date -d errdate,并在awk语句中执行该命令。 试了几种引用的方法,date都提示命令参数错误,date把“20060621 10:21:12”当作两个单词处理。

[ 本帖最后由 blackold 于 2008-6-27 10:41 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-06-27 10:45 |只看该作者
原帖由 cjaizss 于 2008-6-26 23:53 发表
我的思路,把20080621101212兑为秒数
加上5*3600+27*60+50
然后再兑回去

版,怎么再兑回去?请赐教,我也碰到同样问题

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2008-06-27 10:56 |只看该作者

回复 #6 iceer1212 的帖子

利用纪元时间进行转换。

不过也可以直接利用date命令:
  1. $ date -d "20080621 10:12:12 5hour 27min 50sec" +%Y%m%d%H%M%S
  2. 20080621154002
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-06-27 10:58 |只看该作者
原帖由 springwind426 于 2008-6-27 08:32 发表

gawk '{
d=gensub(/(..)/,"\\1 ","g",$6);
sub(/ /,"",d);
d=mktime(d)-(5*3600+27*60+50);
$6=strftime("%Y%m%d%H%M%S",d);
print;
}'  数据文件


注:需要用gnuawk,因为需要用到gnuawk特有的函数 ...

厉害,我测试是正确的

论坛徽章:
0
9 [报告]
发表于 2008-06-27 11:01 |只看该作者
walkerxk@www:~$ echo 1234567890|perl -p ~/script/time.pl
Sat Feb 14 07:31:30 2009
walkerxk@www:~$ cat script/time.pl
#!/usr/bin/perl
s/(1\d{9})/localtime($1)/e
walkerxk@www:~$
应该可以整合到一个命令中,上次弄过了,忘了。

论坛徽章:
0
10 [报告]
发表于 2008-06-27 11:12 |只看该作者
原帖由 blackold 于 2008-6-27 10:35 发表
学习了。
如何将一个含有空格的awk变量(如 errdate="20060621 10:21:12" )作为系统命令(如date)的一个参数,从而构成命令date -d errdate,并在awk语句中执行该命令。 试了几种引用的方法,date都提示命令参数 ...



  1. awk 'BEGIN{d="20060621 10:21:12";d1="date -d \""d"\"";system(d1);}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP