Text-Processing

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

  • March 20, 2020

是否可以使用 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個文件:

分割:

<?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,我使用上面的範例來說明我要解決的問題。

我不認為它可能與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>

引用自:https://unix.stackexchange.com/questions/573826