Chinaunix
标题:
提取标签中的值
[打印本页]
作者:
OS_unix
时间:
2016-08-04 22:26
标题:
提取标签中的值
源文件内容:
<Table diffgr:id="Table5" msdata:rowOrder="4">
<EquipmentId>17</EquipmentId>
<Longitude>119.733178</Longitude>
<Latitude>29.647998</Latitude>
</Table>
<Table diffgr:id="Table5" msdata:rowOrder="4">
<EquipmentId>19</EquipmentId>
</Table>
<Table diffgr:id="Table5" msdata:rowOrder="4">
<EquipmentId>21</EquipmentId>
</Table>
复制代码
处理后的结果:
17 119.733178 29.647998
19 null null
21 null null
复制代码
需求描述:
每个<Table>...</Table>标签中如果存在 EquipmentId、Longitude、Latitude 三个标签,则提取出标签中的值,否则输出null,输出格式如上。
作者:
zxy877298415
时间:
2016-08-04 23:07
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
17 119.733178 29.647998
19 null null
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
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
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
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