split 是否可以用于将文件拆分为多个段,其中每个段的大小基于 XML 元素的匹配数?
例如,当遇到"<test xsi:type="update" locale="en_US">
“为 2 时,下面的 XML 分割
<?xml version="1.0" encoding="UTF-8"?>
<testers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
</testers>
拆分上述 XML 文件应生成 2 个文件。
文件1:
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
文件 2 仅包含一个条目:
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
这是我正在尝试的:
split -p "<test xsi:type=\"update\" locale=\"en_US\">" test.xml segment
输出 4 个文件:
段aa:
<?xml version="1.0" encoding="UTF-8"?>
<testers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
分段:
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
分段:
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
分段:
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
</testers>
可以split
按照我建议的方式使用。我正在处理的文件是40GB,我用上面的例子来说明我试图解决的问题。
答案1
我认为不可能split
。你可以使用awk
:
awk '
BEGIN{
fmt="segment%02d" # 2 digits for suffix, zero padded
start="<test xsi:type=\"update\" locale=\"en_US\">"
end="</test>"
}
$0 == start, $0 == end{
if ($0 == start && ++cnt%2==1){ # for every 2nd start element...
fname=sprintf(fmt, fcnt++) # update output filename
}
print $0 > fname # print line, redirect output to fname
}
' test.xml
这会产生两个文件segment00
和segment01
:
$ head segment*
==> segment00 <==
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
==> segment01 <==
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>