使用 awk 压平 xml

using awk to flatten an xml

我想将 xml 文件压缩为大约 20000 行。

示例输入

 <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

awk 来拯救...

您的数据样本中有一个拼写错误,但对这个脚本来说无关紧要

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

解释:通过关键字定义记录,拆分记录,找到匹配的,用"none"

替换缺失值
$ cat tst.awk
BEGIN { FS="[<>]"; OFS="," }
/<request>/ { if (req!="") print req, odbs; req=; odbs="none" }
/<odbs>/    { odbs= }
END { if (req!="") print req, odbs }

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

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