免费注册 查看新帖 |

Chinaunix

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

[文本处理] 提取标签中的值 [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之四川
日期:2016-07-02 01:12:1415-16赛季CBA联赛之上海
日期:2016-07-02 01:13:3515-16赛季CBA联赛之江苏
日期:2016-07-02 01:50:25
发表于 2016-08-04 22:26 |显示全部楼层
源文件内容:
  1. <Table diffgr:id="Table5" msdata:rowOrder="4">
  2. <EquipmentId>17</EquipmentId>
  3. <Longitude>119.733178</Longitude>
  4. <Latitude>29.647998</Latitude>
  5. </Table>
  6. <Table diffgr:id="Table5" msdata:rowOrder="4">
  7. <EquipmentId>19</EquipmentId>
  8. </Table>
  9. <Table diffgr:id="Table5" msdata:rowOrder="4">
  10. <EquipmentId>21</EquipmentId>
  11. </Table>
复制代码
处理后的结果:
  1. 17 119.733178 29.647998
  2. 19 null  null
  3. 21 null  null
复制代码
需求描述:
每个<Table>...</Table>标签中如果存在 EquipmentId、Longitude、Latitude 三个标签,则提取出标签中的值,否则输出null,输出格式如上。

论坛徽章:
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
发表于 2016-08-04 23:07 |显示全部楼层
  1. awk -vRS="</Table>\n" -F "\n" '{for(i=2;i<=4;i++) {if($i~/(EquipmentId|Longitude|Latitude)/){printf gensub("([^>]+)>([^<]+)(.*)","\\2",1,$i)" "} else {printf "null "} }print ""}' file
  2. 17 119.733178 29.647998
  3. 19 null null
  4. 21 null null
复制代码
回复 1# OS_unix


   

论坛徽章:
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
发表于 2016-08-04 23:10 |显示全部楼层
回复 1# OS_unix

$ perl -0 -lne 'BEGIN{@K=qw/EquipmentId Longitude Latitude/}sub get{my($s,$k)=@_;return($s=~m|<$k>([^<]+)</$k>|?$1:"null")}{while(m|(<Table.+?/Table>)|gs){$x=$1;@r=map{get($x,$_)}@K;print "@r\n"}}' FILE
17 119.733178 29.647998
19 null null
21 null null

   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-08-04 23:10 |显示全部楼层
  1. perl -nle 'if(m~<(/?)Table\b~){next if(!$1);print @a==3?"@a":join(" ",$a[0],("null")x2);@a=()}push(@a,/([\d.]+)/)' f
复制代码
17 119.733178 29.647998
19 null null
21 null null

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-08-05 15:17 |显示全部楼层
  1. sed -r '1{x;s/.*/<EquipmentId>null<Longitude>null<Latitude>null/;x};/<Table/{:a;/<\/Table/!N;s/\n//;ta};G;s/(.*)\n(.*)/\2\n\1/;:b;s/(<[^>]+>)[^<]*(.*\n.*)\1([^<]*)/\1\3\2/;tb;s/\n.*//;s/<[^>]*>/ /g;s/ //' 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
发表于 2016-08-05 16:23 |显示全部楼层
本帖最后由 itfly3 于 2016-08-05 16:24 编辑

我来个亲民的答案
# awk -F'[><]' '/<Table/{if(a)print a,b,c ;a=b=c="null"}/EquipmentId/{a=$3}/Longitude/{b=$3}/Latitude/{c=$3}END{print a,b,c}' t
17 119.733178 29.647998
19 null null
21 null null

评分

参与人数 2信誉积分 +15 收起 理由
ll104567 + 10 6
moperyblue + 5 赞一个!

查看全部评分

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-08-05 16:49 |显示全部楼层
回复 6# itfly3
  1. awk -F'[<>]' '/<Table/{a=b=c="null"}/EquipmentId/{a=$3}/Longitude/{b=$3}/Latitude/{c=$3}/<\/Table/{print a,b,c}' 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
发表于 2016-08-05 16:56 |显示全部楼层
回复 7# moperyblue


    嗯,这个也可以,我那个就是不去考虑它的闭口(</Table>)

论坛徽章:
2
luobin
日期:2016-06-17 17:46:36lufei
日期:2016-06-17 17:49:16
发表于 2016-08-05 17:29 |显示全部楼层
awk -F"<|>" '$2 ~/^EquipmentId/{printf $3" ";s=NR+1}NR==s{printf $2 ~/Longitude/?$3" ":"null ";b=NR+1}NR==b{print  $2 ~/Latitude/?$3:"null"}END{printf NR<b?"null \n":"\n"}' file
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP