免费注册 查看新帖 |

Chinaunix

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

灵活替换的问题,sed,awk均可 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-05-13 16:47 |只看该作者
本帖最后由 springwind426 于 2010-05-13 16:51 编辑

  1. 用 awk 吧

  2. BEGIN{
  3. FS=OFS=","
  4. ch="\047"
  5. a="6,7"
  6. b="2,3,4"
  7. }
  8. {
  9. if(FILENAME~/_1001/){split(a,ar)}else{split(b,ar)}
  10. for(i in ar){$i=sprintf("todate(%s,%syyyymmddhh24Miss%s)",$i,ch,ch)}
  11. print
  12. }


  13. 思路:
  14. 分别用几个数组保存日期字段的位置
  15. 然后根据文件名字来选择数组
  16. 遍历数组,把相应的字段修正一下

  17. PS:上面代码我没有测试
复制代码

论坛徽章:
0
22 [报告]
发表于 2010-05-13 16:50 |只看该作者
恩,根据楼主的描述,是得用到FILENAME

论坛徽章:
0
23 [报告]
发表于 2010-05-13 17:14 |只看该作者
比如说文件名中含有_10001,时间字段是在6,7字段。文件名中含有_10002,是在2,3,4字段。
我是想在 ...
beauty2003 发表于 2010-05-13 16:07


按你的描述写了一个,不过config里面"10001=6,7"的格式我改成了"10001,6,7"的格式,偷懒了。
处理文件时"insert ......"字符串还有最后的");"处理方法很笨拙。

  1. #!/bin/bash

  2. awk 'BEGIN{

  3.     FS=OFS=","

  4. }

  5. ARGIND==1{

  6.     f[$1]=gensub($1",","","1")
  7. }

  8. ARGIND!=1&&FNR==1{

  9.     for(i in f) if(FILENAME~"_"i) { split(f[i], df, ",") }

  10. }

  11. ARGIND!=1{

  12.     gsub(/^insert into info values\(||\);$/,"")
  13.     for(i in df) $df[i]="to_date("$df[i]",\047yyyymmddhh24Miss\047)"
  14.     gsub(/^/,"insert into info values(")
  15.     gsub(/$/,");")
  16.     print > FILENAME

  17. }' config $@

  18. # 用法 ./xxx.sh file1 [file2 file3 ...]
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
24 [报告]
发表于 2010-05-13 17:34 |只看该作者
呵呵,这个学习了。

论坛徽章:
0
25 [报告]
发表于 2010-05-13 23:00 |只看该作者

  1. 写了一个比较难看的正则

  2. sed -r "s/'(19|20)[0-9][0-9](0[0-9]|1[0-2])([012][0-9]|3[01])([01][0-9]|2[0-3])[0-5][0-9][0-5][0-9]'/todate(&,'yyyymmddhh24Miss')/g" 数据文件

复制代码

论坛徽章:
0
26 [报告]
发表于 2010-05-16 17:43 |只看该作者
这几天忙晕了,一直没时间上坛子。
springwind426 兄,谢谢你的思路,不过
for(i in ar){$i=sprintf("todate(%s,%syyyymmddhh24Miss%s)",$i,ch,ch)}

-----》》
这块代码应该要写成for(i in ar){$ar[i]=sprintf("todate(%s,%syyyymmddhh24Miss%s)",$ar[i],ch,ch)}

另外也感谢楼上各位的鼎力相助。

论坛徽章:
0
27 [报告]
发表于 2010-08-03 10:09 |只看该作者
学习 sed
  1. sed "s/\(['][0-9]\{14\}[']\),\(['][0-9]\{14\}[']\))\;/to_date('\1,'yyyymmddhh24Miss'),to_date('\2'yyyymmddhh24Miss'));/" b
复制代码
这样,不就只匹配最后两个时间字段了

论坛徽章:
0
28 [报告]
发表于 2010-08-03 10:15 |只看该作者
应该是这样匹配到最后两个
  1. sed "s/\(.*\)\('[0-9]\{14\}'\),\('[0-9]\{14\}'\))\;/\1to_date(\2,'yyyymmddhh24Miss'),to_date(\3,'yyyymmddhh24Miss'));/" b
复制代码

论坛徽章:
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
29 [报告]
发表于 2010-08-03 10:16 |只看该作者
回复 27# BangBull


    三轮哥很卖力啊。

论坛徽章:
0
30 [报告]
发表于 2010-08-03 10:22 |只看该作者
挖的够深
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP