【问题标题】:Bundle corresponding XML entries捆绑相应的 XML 条目
【发布时间】:2016-03-06 05:11:37
【问题描述】:

我有一个示例 xml 文件 input.xml:

<employee>
<userid>1</userid>
<name>Puneetha B M</name>
<designation>Developer</designation>
</employee>
<employee>
<userid>2</userid>
<name>Bhoomika</name>
<designation>Analyst</designation>
</employee>

现在我需要把它转换成如下格式(输出文件名output.xmlb):我需要把每条记录放到一行

<employee> <userid>1</userid> <name>Puneetha B M</name> <designation>Developer</designation> </employee>
<employee> <userid>2</userid> <name>Bhoomika</name> <designation>Analyst</designation> </employee>

对于这种转换,作者在 unix 中使用了以下命令。

cat input.xml | tr -d '&' | tr '\n' ' ' | tr '\r' ' ' | sed 's|</employee>|</employee>\n|g' | grep -v '^\s*$' > output.xmlb

请任何人帮助我了解这些 un​​ix 命令是如何工作的。 如果您不能很好地理解我的问题,请访问链接:http://blog.puneethabm.in/load-xml-file-to-hive-without-java-code/ 在这里,我试图了解 Step1

【问题讨论】:

  • explainshell.com 给你一个开始。如果您需要了解更多关于任何特定命令在做什么的信息,您可以阅读其手册页以获取更多详细信息(部分信息在上一个链接中提供)。您有更具体的问题吗?
  • 谢谢你。网站很棒。我正在尝试一一了解数据是如何流经每个命令的。

标签: xml sed xml-parsing grep tr


【解决方案1】:

gawk 测试正常

awk -F'<' '!a{a=$2;next}{if($0~a){print FS a,b,$0;a=b=""}else{b=b?b" "$0:$0}}' file
<employee> <userid>1</userid> <name>Puneetha B M</name> <designation>Developer</designation> </employee>
<employee> <userid>2</userid> <name>Bhoomika</name> <designation>Analyst</designation> </employee>

或使用 Sed

sed '/employee/{:a;N;/<\/employee>/!ba;s/\n/ /g;}' file

【讨论】:

  • 不是“这是如何工作的”问题的答案。
【解决方案2】:

使用这个:

tr '\n' ' ' <infile | sed 's|\(</employee>\) |\1\n|g' >outfile
  • tr 用空格替换所有换行符。
  • sed 在结束员工标签后添加换行符。

输出:

<employee> <userid>1</userid> <name>Puneetha B M</name> <designation>Developer</designation> </employee>
<employee> <userid>2</userid> <name>Bhoomika</name> <designation>Analyst</designation> </employee>

【讨论】:

  • 不是“这是如何工作的”问题的答案。
  • 能否请您解释一下命令的以下部分是如何工作的:sed 's||\n|g' | grep -v '^\s*$'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2019-05-28
  • 2015-03-12
  • 2012-07-19
  • 2014-12-03
  • 2013-11-02
  • 2022-01-23
相关资源
最近更新 更多