2015-02-10 138 views
0

我有xml文件,格式如下,我想在csv otput中進行轉換,如下所示。不幸的是我不允許安裝xmlstarlet或其他xml解析器(我只有xmllint)。我怎麼能做到這一點,例如使用時,awk,sed的....Xml文件到CSV輸出

 <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 
+0

我不確定你可以。嘗試在沒有XML解析器的情況下解析XML [這是讓自己瘋狂的好方法](http://stackoverflow.com/a/1732454/4200092)。順便說一句,爲什麼你「不允許安裝」你所需要的工具? – GoBusto 2015-02-10 16:20:15

回答

2

我會幫你xmllint,但你的xml文件不要」看起來是有效的。

反正這裏有一個快速和骯髒的解決方案,你應該避免:

grep -Po "(rbs|site)\d+" file.xml | awk '/site/{site=$1} /rbs/{print $1","site}' 
rbs008811,site00881 
rbs008819,site00881 
rbs008821,site00882 
rbs008829,site00882 
rbs008831,site00883 
rbs008841,site00884 
rbs008849,site00884 
+0

沒關係,但是我沒有使用選項-oP的grep,它沒有安裝不幸...支持的是-hblcnsviw。 – user3319356 2015-02-11 11:19:17

+0

好吧,然後用這個替換grep命令:'perl -lne'/((rbs | site)\ d +)/ && print「$ 1」'' – Tiago 2015-02-11 11:24:21

+0

是的,沒關係,只需要在csv中。格式。有沒有可能像上面那樣轉換它? – user3319356 2015-02-11 12:30:35

0

隨着對XML解析通常保留:

gawk -v OFS=, ' 
    match($0, /VsDataContainer id="([^"]+)/, m) {container = m[1]} 
    match($0, /MeContext=([^,]+)/, m)   {print m[1], container} 
' file 

如果你沒有GNU AWK:

awk -v OFS=, ' 
    /VsDataContainer id="/ { 
     sub(/.*id="/, "") 
     sub(/".*/, "") 
     container = $0 
    } 
    /MeContext=/ { 
     sub(/.*MeContext=/, "") 
     sub(/,.*/, "") 
     print $0, container 
    } 
' file