根據開始和結束 XML 標記分割文件

根據開始和結束 XML 標記分割文件

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

這會產生兩個文件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>

相關內容