2017-04-04 146 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。评论将有助于创建可搜索内容 “ –

相关问题