2017-04-04 144 views
0

我們需要從多個文件中提取多個標記值。 我們大約有1000個文件具有類似的數據:如何從linux中的多個xml文件中提取多個標記值

<Employee> 
     <Id>432361</Id> 
     <EmpName>Stuart</EmpName> 
     <SidNumber>0251115</SidNumber> 
     <CreatedUtc>2016-11-14T22:27:53.477+08:00</CreatedUtc> 
     <EpisodeId>682082</EpisodeId> 
     <CorrelationId>323A6C86-76AA-E611-80DA-005056B46023</CorrelationId> 
    </Employee> 

我們需要從所有文件解壓EmpName,SidNumber和EpisodeId到一個文件中。 我們能夠一次獲得一個值,例如。使用命令:

nawk -F'[<>]' '/<EpisodeId>/{print $3}' *.dat 

但是我們需要獲得每個文件的多個標籤。 輸出格式應該是類似的東西,以

EmpName Stuart SidNumber 0251115 EpisodeId 682082 
EmpName Stuart SidNumber 0251115 EpisodeId 682082 

,或至少有空格分隔值

Stuart 0251115 682082 
Stuart 0251115 682082 

任何幫助,將不勝感激。

由於提前, 維韋克

+3

不要使用'sed'或'awk',它們不適合這項工作。去找一些xml感知工具,比如'xmllint',這裏有一種你不應該做的事情,但是對於小型的xmls來說,這是一個很好的選擇。 '聲明$(awk -v FS ='[<>]''length($ 3){print $ 2「=」$ 3}'inputfile)'then'echo $ EmpName' –

回答

1

試試這個 - (創建f1.txt f2.txt兩個示例文件)

$ head f?.txt 
==> f1.txt <== 
<Employee> 
     <Id>432361</Id> 
     <EmpName>Stuart</EmpName> 
     <SidNumber>0251115</SidNumber> 
     <CreatedUtc>2016-11-14T22:27:53.477+08:00</CreatedUtc> 
     <EpisodeId>682082</EpisodeId> 
     <CorrelationId>323A6C86-76AA-E611-80DA-005056B46023</CorrelationId> 
    </Employee> 

==> f2.txt <== 
<Employee> 
     <Id>432361</Id> 
     <EmpName>vipin</EmpName> 
     <SidNumber>0251117</SidNumber> 
     <CreatedUtc>2016-12-14T22:27:53.477+08:00</CreatedUtc> 
     <EpisodeId>682082</EpisodeId> 
     <CorrelationId>323A6C86-76AA-E611-80DA-005056B46023</CorrelationId> 
    </Employee> 

處理...

$ for i in f?.txt;do awk -F'[<>]' '/EmpName|SidNumber|EpisodeId/{printf $3OFS} END {print ""}' $i;done 
Stuart 0251115 682082 
vipin 0251117 682082 

正確格式化輸出 -

$ for i in f?.txt;do awk -F'[<>]' '/EmpName|SidNumber|EpisodeId/{printf $3OFS} END {print ""}' $i;done|column -t 
Stuart 0251115 682082 
vipin 0251117 682082 

如果沒有可用的列CMD,你可以試試下面CMD -

for i in f?.txt;do awk -F'[<>]' '/EmpName|SidNumber|EpisodeId/{printf "%-10s", $3OFS} END {print ""}' $i;done 
Stuart 0251115 682082  
vipin  0251117 682082 

在awk中的printf函數,我們可以格式化列值。

+0

非常感謝Vipin,你解決了我的問題。如果可能的話還有一個問題,在我的shell命令列中,我得到了「bash:column:command not found」。有沒有其他的格式化輸出。 –

+0

@VivekVishal - 我根據您的需要更新了我的答案,請檢查。'' –

+0

謝謝Vipin,非常感謝您的幫助 –

0
nawk -F'[<>]' '/<EmpName>|<SidNumber>|<EpisodeId>/{print $3}' *.dat 
+0

感謝pyed,只是想知道是否有辦法得到一個格式化的輸出,如EmpName Stuart Stuart 0251115 EpisodeId 682082 –

+0

「您的回答當然值得一點解釋。請參閱http://stackoverflow.com/help/how-to-answer。評論將有助於創建可搜索內容 「 –

相關問題