Xml 文件到 CSV 输出
Xml file to CSV output
我有 xml 文件,其格式如下,我想将其转换为 csv otput,如下所示。不幸的是,我不允许安装 xmlstarlet 或其他一些 xml 解析器(我只有 xmllint)。我该怎么做,例如使用 awk、sed....
<xn:VsDataContainer id="site00881">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008811,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008819,ManagedElement=1</es:listOfNe>
</xn:VsDataContainer>
<xn:VsDataContainer id="site00882">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008821,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008829,ManagedElement=1</es:listOfNe>
</xn:VsDataContainer>
<xn:VsDataContainer id="site00883">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=ASDTUR13,MeContext=rbs008831,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=ASDTUR_SIU,MeContext=siu008832,ManagedElement=siu008832</es:listOfNe>
</xn:VsDataContainer>
<xn:VsDataContainer id="site00884">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008841,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008849,ManagedElement=1</es:listOfNe>
</xn:VsDataContainer>
输出应为 csv 格式
rbs008811,site00881
rbs008819,site00881
rbs008821,site00882
rbs008829,site00882
rbs008831,site00883
siu008832,site00883
rbs008841,site00884
rbs008849,site00884
我会帮助您 xmllint
,但您的 xml 文件无效。
无论如何,这里有一个快速而肮脏的解决方案,您应该避免使用它:
grep -Po "(rbs|site)\d+" file.xml | awk '/site/{site=} /rbs/{print ","site}'
rbs008811,site00881
rbs008819,site00881
rbs008821,site00882
rbs008829,site00882
rbs008831,site00883
rbs008841,site00884
rbs008849,site00884
对解析有通常的保留 XML:
gawk -v OFS=, '
match([=10=], /VsDataContainer id="([^"]+)/, m) {container = m[1]}
match([=10=], /MeContext=([^,]+)/, m) {print m[1], container}
' file
如果您没有 GNU awk:
awk -v OFS=, '
/VsDataContainer id="/ {
sub(/.*id="/, "")
sub(/".*/, "")
container = [=11=]
}
/MeContext=/ {
sub(/.*MeContext=/, "")
sub(/,.*/, "")
print [=11=], container
}
' file
我有 xml 文件,其格式如下,我想将其转换为 csv otput,如下所示。不幸的是,我不允许安装 xmlstarlet 或其他一些 xml 解析器(我只有 xmllint)。我该怎么做,例如使用 awk、sed....
<xn:VsDataContainer id="site00881">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008811,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008819,ManagedElement=1</es:listOfNe>
</xn:VsDataContainer>
<xn:VsDataContainer id="site00882">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008821,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008829,ManagedElement=1</es:listOfNe>
</xn:VsDataContainer>
<xn:VsDataContainer id="site00883">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=ASDTUR13,MeContext=rbs008831,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=ASDTUR_SIU,MeContext=siu008832,ManagedElement=siu008832</es:listOfNe>
</xn:VsDataContainer>
<xn:VsDataContainer id="site00884">
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008841,ManagedElement=1</es:listOfNe>
<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008849,ManagedElement=1</es:listOfNe>
</xn:VsDataContainer>
输出应为 csv 格式
rbs008811,site00881
rbs008819,site00881
rbs008821,site00882
rbs008829,site00882
rbs008831,site00883
siu008832,site00883
rbs008841,site00884
rbs008849,site00884
我会帮助您 xmllint
,但您的 xml 文件无效。
无论如何,这里有一个快速而肮脏的解决方案,您应该避免使用它:
grep -Po "(rbs|site)\d+" file.xml | awk '/site/{site=} /rbs/{print ","site}'
rbs008811,site00881
rbs008819,site00881
rbs008821,site00882
rbs008829,site00882
rbs008831,site00883
rbs008841,site00884
rbs008849,site00884
对解析有通常的保留 XML:
gawk -v OFS=, '
match([=10=], /VsDataContainer id="([^"]+)/, m) {container = m[1]}
match([=10=], /MeContext=([^,]+)/, m) {print m[1], container}
' file
如果您没有 GNU awk:
awk -v OFS=, '
/VsDataContainer id="/ {
sub(/.*id="/, "")
sub(/".*/, "")
container = [=11=]
}
/MeContext=/ {
sub(/.*MeContext=/, "")
sub(/,.*/, "")
print [=11=], container
}
' file