如何从linux中的多个xml文件中提取多个标记值

时间:2017-04-04 04:40:47

标签: linux shell unix awk grep

我们需要从多个文件中提取多个标记值。

我们有大约1000个文件,其数据类似于:

<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

任何帮助将不胜感激。

提前致谢, 的Vivek

2 个答案:

答案 0 :(得分: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函数中,我们可以格式化列值。

答案 1 :(得分:0)

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