【问题标题】:How to extract multiple tag values from multiple xml files in linux如何从linux中的多个xml文件中提取多个标签值
【发布时间】:2018-03-23 03:01:11
【问题描述】:

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

我们有大约 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

任何帮助将不胜感激。

提前致谢, 维韦克

【问题讨论】:

  • 不要选择sedawk,它们不是这项工作的正确工具。去一些像xmllint这样的xml感知工具,这是你不应该做的事情的一种方式,但对于小xml来说很好。 declare $(awk -v FS='[&lt;&gt;]' 'length($3){print $2"="$3}' inputfile) 然后echo $EmpName

标签: linux shell unix awk grep


【解决方案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 函数中,我们可以格式化列值。

【讨论】:

  • 非常感谢 Vipin,您解决了我的问题。如果可能再问一个问题,在我的列命令外壳中,我得到“bash:column:command not found”。有没有其他方法可以格式化输出。
  • @VivekVishal - 我已根据您的需要更新了我的答案,请检查。''
  • 感谢 Vipin,非常感谢您的帮助
【解决方案2】:
nawk -F'[<>]' '/<EmpName>|<SidNumber>|<EpisodeId>/{print $3}' *.dat

【讨论】:

  • 谢谢 pyed,只是想知道是否有办法获得像 EmpName Stuart Stuart 0251115 EpisodeId 682082 这样的格式化输出
  • "您的回答当然值得一点解释。请参考stackoverflow.com/help/how-to-answer。评论将有助于创建可搜索的内容。"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2020-11-20
  • 2013-06-01
  • 2022-01-27
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多