使用 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" 值(包括最后一个)都会产生正确的输出,并且不会为空输入文件产生任何输出(总是需要)。
我想将 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" 值(包括最后一个)都会产生正确的输出,并且不会为空输入文件产生任何输出(总是需要)。