Xml 如何使用awk打印每N个匹配项
我正在尝试将一个大型xml文件拆分为几个较小的文件。我找到了一个解决方案,可以将每个节点拆分为自己的文件:Xml 如何使用awk打印每N个匹配项,xml,split,awk,Xml,Split,Awk,我正在尝试将一个大型xml文件拆分为几个较小的文件。我找到了一个解决方案,可以将每个节点拆分为自己的文件: awk '/<mono/{close("row"count".xml");count++}count{f="row"count".xml";print $0 > f}' file.xml awk'/f}file.xml 上面的代码匹配每个“mono”节点,并将其输出到文件名row{rownumber}.xml。如何将每20个匹配项打印到一个文件?保持两个计数-当前一个和一
awk '/<mono/{close("row"count".xml");count++}count{f="row"count".xml";print $0 > f}' file.xml
awk'/f}file.xml
上面的代码匹配每个“mono”节点,并将其输出到文件名row{rownumber}.xml。如何将每20个匹配项打印到一个文件?保持两个计数-当前一个和一个重复计数。仅当重复计数模20处于适当值(所示代码中的0和1)时,才执行当前活动(打印标记): 它包含100行
行和少量忽略
行(一些重复)。它生成了文件row.xml
,row1.xml
row4.xml
每行20行。这是在MacOS X 10.6.6上用标准(BSD)awk
测试的,我要说的是保留“count”变量,您只需要更改构建文件名的方式:f=“row”int(count/20)”.xml“
您不必显式关闭该文件。awk退出时,所有打开的文件都将关闭。鉴于这些评论,我将发表这一评论。注意:在下面的代码中,一个文件最多会关闭20次,但会根据需要重新打开
awk '
/<mono/ {close f; count++; f = "row" int(count/20) ".xml"}
count {print >> f}
' file.xml
awk'
/>f}
'file.xml
我认为这是一个正确的方向,但由于我打印到“row”count.xml,所以每个节点都有单独的文件。我试着打印到“row”repeat.xml,每20行就有一个文件,但是每个文件中只有一个节点,我猜我的问题用词错了。我想将第1-20行、第21-40行等打印到单独的文件中。@spyderman4g63:将print
移到它自己的{}
块中,然后再移到其他两个块中。我似乎无法使它工作。除了使用awk,我还应该采取其他方法吗?从gawk
info
文件:“以下是关闭输出文件的一些原因:。。。在同一个“awk”程序中连续写入多个文件。如果文件未关闭,“awk”最终可能会超过一个进程中打开文件数量的系统限制。最好在程序完成编写后关闭每个文件。”如果有30000000条记录,那么关闭每个文件是必要的。这很简单,并且实现了我所需要的。尽管我仍然不确定发生了什么。
awk '/<mono/ { if (recno > 1 && recno % 20 == 0) { close(file); count++;}
if (recno % 20 == 0) { file = "row" count ".xml" }
print $0 > file
recno++
}' file.xml
<mono> <tonous val=001/> </mono>
ignore
<mono> <tonous val=002/> </mono>
<mono> <tonous val=003/> </mono>
<mono> <tonous val=004/> </mono>
<mono> <tonous val=005/> </mono>
ignore
<mono> <tonous val=006/> </mono>
<mono> <tonous val=007/> </mono>
<mono> <tonous val=008/> </mono>
<mono> <tonous val=009/> </mono>
ignore
<mono> <tonous val=010/> </mono>
<mono> <tonous val=011/> </mono>
<mono> <tonous val=012/> </mono>
<mono> <tonous val=013/> </mono>
<mono> <tonous val=014/> </mono>
ignore
<mono> <tonous val=015/> </mono>
<mono> <tonous val=016/> </mono>
<mono> <tonous val=017/> </mono>
<mono> <tonous val=018/> </mono>
<mono> <tonous val=019/> </mono>
ignore
<mono> <tonous val=020/> </mono>
<mono> <tonous val=021/> </mono>
<mono> <tonous val=022/> </mono>
<mono> <tonous val=023/> </mono>
ignore
<mono> <tonous val=024/> </mono>
...
awk '
/<mono/ {close f; count++; f = "row" int(count/20) ".xml"}
count {print >> f}
' file.xml