免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3351 | 回复: 7

[awk] 设定匹配规则文件? [复制链接]

论坛徽章:
0
发表于 2011-07-28 11:41 |显示全部楼层
有多个文件,含有如下语句,行有可能乱序

filenamexxx.txt
...
The clock shows "12:00:00"
The month is "Jan" and the day is "31"
The-location-is-Beijing-(China)                             
...

我想定义规则文件给 awk 运行时候读入
#keywords     IFS   fieldNo
#===================
clock               " "     $4
month            " "      $4
day                " "      $9
location         "-"      $4

想要达到的目的是,匹配 keywords, 用IFS分割此行,然后依次打引fieldNo所代表的字段

求读入匹配文件的函数

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-28 12:04 |显示全部楼层
回复 1# iamkey9


    这样行不?
  1. $ echo 'The clock shows "12:00:00"
  2. The month is "Jan" and the day is "31"
  3. The-location-is-Beijing-(China) ' |\
  4. awk -F'[" -]' '/clock|month/{print $2": "$5}/location/{print "day: "$4}/day/{print $2": "$(NF-1)}'
  5. clock: 12:00:00
  6. month: Jan
  7. month: 31
  8. day: Beijing
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2014-03-27 15:44:382015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-07-28 12:28 |显示全部楼层
大神在楼上

论坛徽章:
0
发表于 2011-07-28 12:29 |显示全部楼层
回复 2# yinyuemi


    不知道他这个文件会不规则到什么程度,说不定下一条记录里local又用引号day用-了....
   我觉得能生成这么不规则的文件也不容易啊

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-28 13:03 |显示全部楼层
回复 4# mpstat


    从lz的描述来看,我理解的是,只是行乱序,对于特定的行,格式应该是固定的

论坛徽章:
0
发表于 2011-07-28 13:27 |显示全部楼层
本帖最后由 iamkey9 于 2011-07-28 13:30 编辑

回复 5# yinyuemi


谢谢,其实我是想把AWK和规则文件分开,这样以后看不懂AWK的人也可以改规则文件,另外,行格式是基本固定的(其实不固定也没关系,添加新规则就可以了)

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-28 14:18 |显示全部楼层
回复 6# iamkey9
  1. head format.txt data
  2. ==> format.txt <==
  3. #keywords     IFS   fieldNo
  4. #===================
  5. clock               " "     4
  6. month            " "      4
  7. day                " "      9
  8. location         "-"      4

  9. ==> data <==
  10. The clock shows "12:00:00"
  11. The month is "Jan" and the day is "31"
  12. The-location-is-Beijing-(China)

  13. awk  'NR>2&&NR==FNR{a[gensub(/ /,"","g",$1)]=$2;b[gensub(/ /,"","g",$1)]=gensub(/ /,"","g",$3)}
  14. NR>FNR{if(/location/){t=a["location"];split($0,c,t);print c[2],": "c[b[c[2]]]};
  15. if(/month/){t=a["month"];l=split($0,c,t);print c[2],": "c[b[c[2]]] RS "day: "c[b["day"]]};
  16. if(/clock/){t=a["clock"];split($0,c,t);print c[2],": "c[b[c[2]]]};delete c}
  17. ' FS='"' format.txt  data
  18. clock : "12:00:00"
  19. month : "Jan"
  20. day: "31"
  21. location : Beijing
复制代码

论坛徽章:
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
发表于 2011-07-28 15:59 |显示全部楼层
有多个文件,含有如下语句,行有可能乱序

filenamexxx.txt
...
The clock shows "12:00:00"
The mont ...
iamkey9 发表于 2011-07-28 11:41



$ cat awk_rule
# keywords FieldNo IFS
#====================
clock 4 " "
month 4 " "
day   9 " "
location 4 "-"
test 2 "[=,]"
name 4 "[=,]"

$ cat f1.txt
...
The clock shows "12:00:00"
The month is "Jan" and the day is "31"
The-location-is-Beijing-(China)
test=123,name=John
...

$ awk 'FNR==NR{if(!/^[ \t]*#/){if(NF<3){print "error:"$0;exit}kw[n]=$1;no[n]=$2;s[n]=$3;if(NF>3){for(a=4;a<=NF;a++)s[n]=s[n]" "$a;}}s[n]=substr(s[n],2,length(s[n])-2);n++}NR>FNR{for(n in kw){if(match($0,kw[n])){split($0,m,s[n]);print kw[n]"="m[no[n]]}}}' awk_rule f1.txt
clock="12:00:00"
day="31"
month="Jan"
location=Beijing
test=123
name=John
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP