【问题标题】:using awk to flatten an xml使用 awk 展平 xml
【发布时间】:2015-11-29 19:34:24
【问题描述】:

我想用大约 20000 行来展平 xml 文件。

示例输入

 <start>                             
     <request>523331111111111</request>   
     <odbs>1</odbs>          
     <request>523331111111112</request>  
     <odbs>0</odbs>          
     <request>523331111111113</request>  
     <odbs>1</odbs>          
     <request>523331111111114</request>                
     <request>523331111111115</request>  
     <odbs>2</odbs>        
 </start>

预期输出是

523331111111111,1
523331111111112,0
523331111111113,1
523331111111114,none
523331111111115,2

【问题讨论】:

  • 从逻辑上讲,第一个请求和第一个 odb 之间没有关系。你应该改变你的 xml 结构:&lt;start&gt;&lt;pair&gt;&lt;request&gt;R&lt;/request&gt;&lt;odbs&gt;O&lt;/odbs&gt;&lt;/pair&gt;&lt;pair&gt;...
  • 文件的创建方式是,顶部请求将与行下方的 odbs 配对(如果有 obds 的值),否则为无

标签: xml awk flatten


【解决方案1】:
$ cat tst.awk
BEGIN { FS="[<>]"; OFS="," }
/<request>/ { if (req!="") print req, odbs; req=$3; odbs="none" }
/<odbs>/    { odbs=$3 }
END { if (req!="") print req, odbs }

$ awk -f tst.awk file
523331111111111,1
523331111111112,0
523331111111113,1
523331111111114,none
523331111111115,2

以上内容适用于任何 awk,无论缺少哪个“odbs”值(包括最后一个),都会产生正确的输出,并且不会为空输入文件产生任何输出(总是可取的)。

【讨论】:

    【解决方案2】:

    求救...

    您的数据样本中有错字,但与此脚本无关

    awk -F "[<>]" -vRS="<request>" -vOFS="," 'NR>1{print $1, $5==""?"none":$5}'
    

    说明:按关键字定义记录,拆分记录,找到匹配的,用“none”替换缺失值

    【讨论】:

    • @jimbo,请务必通过单击每个问题上向上和向下箭头的复选标记来“接受”解决您问题的答案。这给了作者声誉积分,并激励他们继续回答问题;-) 祝大家好运。
    • 您应该提到该解决方案是由多字符 RS 提供的 gawk 特定的,更重要的是,当输入中的最后一个请求缺少后续的 行时,它将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2018-08-25
    • 2012-03-02
    • 2012-03-02
    • 2012-05-23
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多