bash:将管道流拆分为记录,并将记录中的所有行合并为一个

时间:2017-01-08 07:32:30

标签: json xml bash awk

我有一个包含一百万个单独的xml文件(简单连接)的文件,我想将其转换为json。该文件如下所示:

<amf xmlns="...">
 <test>
   1 content
 </test>
</amf>
<amf xmlns="...">
 <test>
   2 content
 </test>
</amf>

请注意,上面的文件不是格式正确的xml文件(即各个条目没有嵌套),所以我无法使用`xml2json'进行转换。

为了实现这一点,我想将文件分成记录,以便每个记录对应于单个xml文件,将xml文件连接成一行,然后在应用{{1}的每一行上使用parallel实现xml2json输出。

当我尝试在OSX上使用jsonawk时,我无法将管道拆分为记录。这是我尝试过的代码(“无用”cat是为了便于阅读):

gawk

给出了:

cat bigfile.xml | awk '{print NR "<amf xml"$0}' RS="<amf xml"

删除第一个'记录'很容易,但我不能将其他记录的输出折叠为每个记录的一行。我试着尝试FS =“\ n”和OFS =“”没有太多运气。

你能帮助我在每条记录的一行输出这些记录吗?

3 个答案:

答案 0 :(得分:1)

添加$1=$1似乎解决了我的问题:

awk '{$1=$1; print NR "<amf xml"$0}' RS="<amf xml" bigfile.xml

我仍然需要手动摆脱第一行,但这似乎没问题。

1<amf xml
2<amf xmlns="...">  <test>    1 content  </test> </amf> 
3<amf xmlns="...">  <test>    2 content  </test> </amf>

答案 1 :(得分:1)

使用GNU awk进行多字符RS和RT:

$ awk -v RS='</amf>\n' '{$1=$1; ORS=RT}1' file
<amf xmlns="..."> <test> 1 content </test></amf>
<amf xmlns="..."> <test> 2 content </test></amf>

答案 2 :(得分:0)

试试这个......

$ awk -v RS='<amf xml' 'NF{$1=$1; print RS $0}' file