Chinaunix

标题: 如何用awk把文件中的数字式时间转化成通用时间 [打印本页]

作者: ever518    时间: 2010-07-07 12:55
标题: 如何用awk把文件中的数字式时间转化成通用时间
如文件1中:
1275825275 1275706961
1275806888 1275706982
1275835131 1275707448
1275828014 1275747097

如何用AWK转化成如下格式:
Sun Jun  6 19:54:35 CST 2010    Sat Jun  5 11:02:41 CST 2010
Sun Jun  6 14:48:08 CST 2010    Sat Jun  5 11:03:02 CST 2010
Sun Jun  6 22:38:51 CST 2010    Sat Jun  5 11:10:48 CST 2010
Sun Jun  6 20:40:14 CST 2010    Sat Jun  5 22:11:37 CST 2010

其中的某个数字如1275825275转化日期
就是命令 date -d '1970-01-01 UTC 1275825275  seconds'  成 Sun Jun  6 19:54:35 CST 2010
作者: lkk2003rty    时间: 2010-07-07 13:06
本帖最后由 lkk2003rty 于 2010-07-07 13:10 编辑
  1. awk '{for(i=1;i<=NF;i++)printf "%s ",strftime("%a %b %d %H:%M:%S %Z %Y", $i);printf "\n"}' file
复制代码

作者: ywlscpl    时间: 2010-07-07 13:09
  1. LANG=C awk '{print strftime("%a %b %d %T %Z %Y",$1),strftime("%a %b %d %T %Z %Y",$2)}' file
复制代码

作者: ever518    时间: 2010-07-07 13:09
本帖最后由 ever518 于 2010-07-07 13:12 编辑

我的意思是用AWK一下子全部处理文件1中全部的数字式的时间,而且是格式一行2个字对应整齐的。
你这样的话和我用笨办法date -d "1970-0101" 转化,这个没什么大的区别。
作者: bbgg1983    时间: 2010-07-07 13:10
学习了
作者: ever518    时间: 2010-07-07 13:15
ywlscpl 厉害 算明白我的意思了。
因为我要处理一个月的某种都是这样格式的文件。大概有几十万行的信息,用shell写个程序当然我也会实现,但处理速度比较慢。

谢谢 ywlscpl 。
作者: Shell_HAT    时间: 2010-07-07 13:49
回复 6# ever518


能够把你写的处理速度比较慢的Shell程序贴出来看看?
作者: iori809    时间: 2010-07-07 13:56
ywlscpl  理解需求的能力太强了~
作者: rdcwayx    时间: 2010-07-07 14:50
ywlscpl 发表于 2010-07-07 13:09
LANG=C awk '{print strftime("%a %b %d %T %Z %Y",$1),strftime("%a %b %d %T %Z %Y",$2)}' file


不知道大家为何吹捧ywlscpl,这种写法很无聊的。

免得写两次strftime:
  1. awk 'function a(b) {return strftime("%a %b %d %T %Z %Y",b)}{print a($1),a($2)}' file
复制代码
其实 lkk2003rty (小毛孩) 的更通用些,比如有多列的情况。
作者: ywlscpl    时间: 2010-07-07 15:03
回复 9# rdcwayx


    呵呵,我是怎么快怎么来
复制-粘贴,把1改成2
作者: iori809    时间: 2010-07-07 15:10
回复 9# rdcwayx


   兄弟真是误会 ywlscpl 了~
你可以翻翻他以前的帖子~千万不要以为他不会写for循环呵呵
ywlscpl八成是程序员出身
作者: rdcwayx    时间: 2010-07-07 15:14
哦, 误会啊。
作者: 夏天要下雨    时间: 2010-07-07 15:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: ywlscpl    时间: 2010-07-07 15:46
回复 13# 夏天要下雨


    中文环境%a打出来是一 二 三,%b打出来是一月、二月 这样,加个LANG=C保证打出来的是英文
作者: 夏天要下雨    时间: 2010-07-07 15:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 夏天要下雨    时间: 2010-07-07 16:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: 夏天要下雨    时间: 2010-07-07 16:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: lkk2003rty    时间: 2010-07-07 16:37
本帖最后由 lkk2003rty 于 2010-07-07 16:51 编辑

回复 17# 夏天要下雨


    LANG=C awk '{for(i=1;i<=NF;i++) print strftime("%a %b %d %T %Z %Y",$i)}' file
先说这个。。。。是这样是因为 print会打印后面的东西然后换行 所以 比如你file文件里是一行两条数据  结果  awk处理这一条的时候 就会给你打印出两行

awk '{for(i=1;i<=NF;i++)printf "%s ",strftime("%a %b %d %H:%M:%S %Z %Y", $i);printf "\n"}' file
然后你指的分号是红色的那个地方么?printf其实和print的作用都是一样的 打印出后面的东西 %s是格式控制符  值把后面的strftime返回的那一堆当做字符串打印出来
那个分号就是表示一个语句终结
这个循环就是  遍历文件中的每一个 时间戳 然后打印出转换后的字符串 所有的遍历完自后打印换行
作者: 夏天要下雨    时间: 2010-07-07 17:03
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2