
split を使用して、各セグメントのサイズが XML 要素の一致数に基づいて、ファイルを複数のセグメントに分割できますか?
たとえば、以下のXML分割では、"<test xsi:type="update" locale="en_US">
「」の出現回数が2の場合
<?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 には 1 つのエントリのみが含まれます。
<test xsi:type="update" locale="en_US">
<rval>1</rval>
</test>
私が試しているのは次のことです:
split -p "<test xsi:type=\"update\" locale=\"en_US\">" test.xml segment
4 つのファイルが出力されます:
セグメント:
<?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
私が提案する方法で利用できます。処理しているファイルは 40 GB で、上記の例を使用して、解決しようとしている問題を説明します。
答え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
これにより、次の 2 つのファイルが生成されます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>