Chinaunix

标题: 提取标签中的值 [打印本页]

作者: OS_unix    时间: 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,输出格式如上。
作者: zxy877298415    时间: 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


   
作者: jason680    时间: 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

   
作者: sunzhiguolu    时间: 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

作者: moperyblue    时间: 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
复制代码

作者: itfly3    时间: 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
作者: moperyblue    时间: 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
复制代码

作者: itfly3    时间: 2016-08-05 16:56
回复 7# moperyblue


    嗯,这个也可以,我那个就是不去考虑它的闭口(</Table>)
作者: hz_oracle    时间: 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





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2