免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: stonejar
打印 上一主题 下一主题

[文本处理] 请教把文件中英文格式的时间字段替换成标准格式的时间字段,例如May 20 2014 10:29:41 [复制链接]

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
11 [报告]
发表于 2016-01-20 17:00 |只看该作者
sed -r 's/:[^:]*(.)M/ \1M/' file|while read line ;do time=`echo $line|grep -oP "[^#]+:[^#]+"`;if [[ $? -eq 0 ]];then i="`date -d "$time" +%F" "%T`";echo $line|sed "s/[^#]*:[^#]*/$i/"; else echo $line;fi;done

把file换成你的文件名即可。

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
12 [报告]
发表于 2016-01-20 17:04 |只看该作者
sed -r 's/:[^:]*(.)M/ \1M/' file|while read line ;do time=`echo $line|grep -oP "[^#]+:[^#]+"`;if [[ $? -eq 0 ]];then i="`date -d "$time" +%F" "%T`";echo $line|sed "s/[^#]*:[^#]*/$i/"; else echo $line;fi;done

把file换成你的文件名即可。

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
13 [报告]
发表于 2016-01-20 17:16 |只看该作者
11111111111111111111111

论坛徽章:
0
14 [报告]
发表于 2016-01-20 17:33 |只看该作者
回复 2# haooooaaa

谢谢高手,我明白了,是要装gawk 4以上版本的。

但还有个问题,例如文件x2内容如下:
cat x2
000014##1##11##129##Jun 27 2014 12:00:00:000AM## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##Jul  3 2014 10:47:27:786AM##N####00##4##yaoxw1##Jul  2 2014 10:47:27:630AM##00##WD####13800138000#### ## ##yaoxw1##Jul 21 2014  2:36:42:656PM##749659##Aug 25 2014  2:31:31:313PM## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################

会报错如下:
awk: cmd. line:19: (FILENAME=x2 FNR=1) fatal: strftime: second argument less than 0 or too big for time_t

   

论坛徽章:
0
15 [报告]
发表于 2016-01-20 17:39 |只看该作者
回复 2# haooooaaa


谢谢高手,我明白了,是要装gawk 4以上版本的。

但还有个问题,例如文件x2内容如下:
cat x2
000014##1##11##129##Jun 27 2014 12:00:00:000AM## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##Jul  3 2014 10:47:27:786AM##N####00##4##yaoxw1##Jul  2 2014 10:47:27:630AM##00##WD####13800138000#### ## ##yaoxw1##Jul 21 2014  2:36:42:656PM##749659##Aug 25 2014  2:31:31:313PM## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################

会报错如下:
awk: cmd. line:19: (FILENAME=x2 FNR=1) fatal: strftime: second argument less than 0 or too big for time_t

   

论坛徽章:
0
16 [报告]
发表于 2016-01-20 17:47 |只看该作者
回复 2# haooooaaa


谢谢高手,我明白了,是要装gawk 4以上版本的。

但还有个问题,例如文件x2内容如下:
cat x2
000014##1##11##129##Jun 27 2014 12:00:00:000AM## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##Jul  3 2014 10:47:27:786AM##N####00##4##yaoxw1##Jul  2 2014 10:47:27:630AM##00##WD####13800138000#### ## ##yaoxw1##Jul 21 2014  2:36:42:656PM##749659##Aug 25 2014  2:31:31:313PM## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################

会报错如下:
awk: cmd. line:19: (FILENAME=x2 FNR=1) fatal: strftime: second argument less than 0 or too big for time_t

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
17 [报告]
发表于 2016-01-20 20:47 |只看该作者
本帖最后由 jason680 于 2016-01-20 20:52 编辑

回复 1# stonejar

$ cat FILE
1##5667##Jan 2 2013 10:29:41:076PM##Jan 2 2013 10:29:41:076PM##rtyr##中国
2##ewrer##Apr 17 2016 10:29:41:076AM##Jan 2 2013 10:29:41:076PM##rty##埃及

3##hjkhjk##Oct 9 2012 1:29:41:076AM##Jan 2 2013 10:29:41:076PM##tyityu##伊朗

$ awk  'BEGIN{FS=OFS="##";t=split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",a," ");for(n=1;n<=t;n++)a[a[n]]=n;a["PM"]=12}{for(n=1;n<=NF;n++)if(match($n,/(...) ([0-9]+) +([0-9]+) +([0-9]+):([0-9]+):([0-9]+):...([AP]M)/,m))$n=sprintf("%d-%02d-%02d %02d:%02d:%02d",m[3],a[m[1]],m[2],m[4]+a[m[7]],m[5],m[6])}1' FILE
1##5667##2013-01-02 22:29:41##2013-01-02 22:29:41##rtyr##中国
2##ewrer##2016-04-17 10:29:41##2013-01-02 22:29:41##rty##埃及

3##hjkhjk##2012-10-09 01:29:41##2013-01-02 22:29:41##tyityu##伊朗
   

论坛徽章:
0
18 [报告]
发表于 2016-01-21 08:50 |只看该作者
回复 2# haooooaaa

您好,您哪个脚本在转换日期是单个值且前面有两个空格(例如3日它不是表示成“ 03”,而是表示成了“  3”)或者小时是单个值且前面有两个空格(例如2点它不是表示成“ 02”,而是表示成了“  2”)时会报错如下:
awk: cmd. line:19: (FILENAME=x2 FNR=1) fatal: strftime: second argument less than 0 or too big for time_t

需要转换的文件如下:
000014##1##11##129##Jun 27 2014 12:00:00:000AM## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##Jul  3 2014 10:47:27:786AM##N####00##4##yaoxw1##Jul  2 2014 10:47:27:630AM##00##WD####13800138000#### ## ##yaoxw1##Jul 21 2014  2:36:42:656PM##749659##Aug 25 2014  2:31:31:313PM## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################

谢谢您的帮助,非常感动



   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
19 [报告]
发表于 2016-01-21 09:58 |只看该作者
本帖最后由 jason680 于 2016-01-21 09:59 编辑

回复 18# stonejar

$ awk  'BEGIN{FS=OFS="##";t=split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",a," ");for(n=1;n<=t;n++)a[a[n]]=n;a["PM"]=12}{for(n=1;n<=NF;n++)if(match($n,/^(...) +([0-9]+) +([0-9]+) +([0-9]+):([0-9]+):([0-9]+):...([AP]M)/,m))$n=sprintf("%d-%02d-%02d %02d:%02d:%02d",m[3],a[m[1]],m[2],m[4]+a[m[7]],m[5],m[6])}1' x2 > x3

$ cat x3
000014##1##11##129##2014-06-27 12:00:00## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##2014-07-03 10:47:27##N####00##4##yaoxw1##2014-07-02 10:47:27##00##WD####13800138000#### ## ##yaoxw1##2014-07-21 14:36:42##749659##2014-08-25 14:31:31## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################

$ awk  'BEGIN{FS="##"}{getline s < "x3";split(s,a);for(n=1;n<=NF;n++)if($n!=a[n])print $n" => "a[n]}' x2
Jun 27 2014 12:00:00:000AM => 2014-06-27 12:00:00
Jul  3 2014 10:47:27:786AM => 2014-07-03 10:47:27
Jul  2 2014 10:47:27:630AM => 2014-07-02 10:47:27
Jul 21 2014  2:36:42:656PM => 2014-07-21 14:36:42
Aug 25 2014  2:31:31:313PM => 2014-08-25 14:31:31

   

论坛徽章:
0
20 [报告]
发表于 2016-01-21 11:47 |只看该作者
回复 19# jason680


    您好,转换出来只剩下时间了哦,其他字符串也要回补哦,例如
转换前的文件是:
000014##1##11##129##Jun 27 2014 12:00:00:000AM## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##Jul  3 2014 10:47:27:786AM##N####00##4##yaoxw1##Jul  2 2014 10:47:27:630AM##00##WD####13800138000#### ## ##yaoxw1##Jul 21 2014  2:36:42:656PM##749659##Aug 25 2014  2:31:31:313PM## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################

转换后的需要是这样的:
000014##1##11##129##2014-06-27 12:00:00## ## ## ##1212121yaoxw##3## ## ## ## ## ## ## ##行李晚到##2014-07-03 10:47:27##N####00##4##yaoxw1##2014-07-02 10:47:27##00##WD####13800138000#### ## ##yaoxw1##2014-07-21 14:36:42##749659##2014-08-25 14:31:31## ##Y####N## ##yaoxw##13800138000## ##ff8080814113e09d0141c5ef70a5020e## ## ## ## ##满意############################


非常感谢您的帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP