免费注册 查看新帖 |

Chinaunix

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

[文本处理] 各位好,怎么替换May 20 2014 10:29:41:076AM为2014-05-20 10:29:41 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-20 09:15 |只看该作者 |倒序浏览
各位大侠好,一下是我的文件内容:
cat test.txt


ggg##May 20 2014 10:29:41:076AM##abc##中国
234sdf##Apr 25 2015 10:29:41:076AM##gcd##美国
4747##Sep 29 2015 10:29:41:076AM##yyy##美国

如何用shell变成以下内容:
ggg##2014-05-20 10:29:41##abc##中国
234sdf##2015-04-25 10:29:41##gcd##美国
4747##2015-09-29 10:29:41##yyy##美国

也就是文本中可能出现所有12个月的英文字串替换成数字月份,并且把后面的微秒去掉,并且如果是AM时直接去掉AM,为PM时时间加上12小时为24小时制。并且类似要格式化May 20 2014 10:29:41:076AM成2014-05-20 10:29:41

感谢各位大神了哈

论坛徽章:
6
2015亚冠之广州恒大
日期:2015-05-25 15:01:512015亚冠之大阪钢巴
日期:2015-11-09 21:04:562015亚冠之山东鲁能
日期:2015-11-11 14:30:3215-16赛季CBA联赛之山西
日期:2016-03-11 11:11:5215-16赛季CBA联赛之江苏
日期:2016-04-06 10:48:4915-16赛季CBA联赛之北控
日期:2016-11-09 10:23:22
2 [报告]
发表于 2016-01-20 09:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
3 [报告]
发表于 2016-01-20 10:08 |只看该作者
  1. awk -F '##| +' 'BEGIN{a["01"]="Jan";
  2. a["Feb"]="02";
  3. a["Mar"]="03";
  4. a["Apr"]="04";
  5. a["May"]="05";
  6. a["Jun"]="06";
  7. a["Jul"]="07";
  8. a["Aug"]="08";
  9. a["Sep"]="09";
  10. a["Oct"]="10";
  11. a["Nov"]="11";
  12. a["Dec"]="12"}{split($5,b,":");t="##"$NF"##"$(NF-1);printf  $1"##"$4"-"a[$2]"-"$3;if(b[4]~/AM/) {print " "b[1]":"b[2]":"b[3] t} if(b[4]~/PM/) {print " "b[1]+12":"b[2]":"b[3]t}}' file
复制代码
回复 1# stonejar


   

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
4 [报告]
发表于 2016-01-20 10:13 |只看该作者
  1. awk '
  2. BEGIN{
  3.     OFS=FS="##"
  4.     a["PM"]=12
  5. }
  6. {
  7.     split($2,t,"[ :]")
  8.     $2=strftime("%F %T",mktime(t[3]" "(index("JanFebMarAprMayJunJulAugSepOctNovDec",t[1])+2)/3" "t[2]" "t[4]" "t[5]" "t[6])+a[substr(t[7],4)]*3600)
  9. }1
  10. ' file
复制代码

论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
5 [报告]
发表于 2016-01-20 10:29 |只看该作者
本帖最后由 sync_1521 于 2016-01-20 10:32 编辑

awk --posix 'BEGIN{FS=OFS="##"}{sub(":[0-9]{3}"," ",$2);"date -d \""$2"\" \"+%F %T\""|getline $2}1'

论坛徽章:
0
6 [报告]
发表于 2016-01-20 13:04 |只看该作者
回复 3# zxy877298415

您好,高手,得到的结果是这样的哦
如果下面有空行的话,例如
ggg##Jan 20 2014 10:29:41:076PM##abc##中国
234sdf##Apr 25 2015 10:29:41:076AM##gcd##美国

4747##Sep 29 2015 10:29:41:076AM##yyy##美国

得到的结果是这样的哦
ggg##2014-01-20 22:29:41##中国##abc
234sdf##2015-04-25 10:29:41##美国##gcd
##--4747##2015-09-29 10:29:41##美国##yyy

感谢您的帮助


   

论坛徽章:
0
7 [报告]
发表于 2016-01-20 13:44 |只看该作者
本帖最后由 stonejar 于 2016-01-20 13:52 编辑

回复 4# haooooaaa

您好,高手,如果碰到空行和没有##分隔符时或者时间字段没有值时会出现这样的结果:


ggg##2014-01-20 22:29:41##abc##中国
234sdf##2015-04-25 10:29:41##gcd##美国
##1970-01-01 07:59:59
4747##2015-09-29 01:29:41##yyy##美国

多出了"##1970-01-01 07:59:59",请问怎么修改呢,感谢您的帮助
   

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
8 [报告]
发表于 2016-01-20 13:47 |只看该作者
回复 7# stonejar
  1. awk '
  2. BEGIN{
  3.     OFS=FS="##"
  4.     a["PM"]=12
  5. }
  6. NF{
  7.     split($2,t,"[ :]")
  8.     $2=strftime("%F %T",mktime(t[3]" "(index("JanFebMarAprMayJunJulAugSepOctNovDec",t[1])+2)/3" "t[2]" "t[4]" "t[5]" "t[6])+a[substr(t[7],4)]*3600)
  9.     print
  10. }
  11. '  file
复制代码

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


    时间字段为空值时也会多出了"##1970-01-01 07:59:59",请问怎么修改呢,感谢您的帮助,真是热心人,好人有好报

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
10 [报告]
发表于 2016-01-20 14:28 |只看该作者
回复 6# stonejar
那就把空行去掉第二个大括号前加个!/^$/


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP