開始および終了XMLタグに基づいてファイルを分割する

開始および終了XMLタグに基づいてファイルを分割する

分割を使用してファイルをセグメントに分割できますか?各セグメントのサイズは、XML要素の一致数に基づいています。

たとえば、「2」の場合、"<test xsi:type="update" locale="en_US">次の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には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つのファイル出力:

セクション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

これにより、2つのファイルが作成されますsegment00segment01

$ 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>

関連情報