Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何使用awk打印每N个匹配项_Xml_Split_Awk - Fatal编程技术网

Xml 如何使用awk打印每N个匹配项

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个匹配项打印到一个文件?保持两个计数-当前一个和一

我正在尝试将一个大型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个匹配项打印到一个文件?

保持两个计数-当前一个和一个重复计数。仅当重复计数模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