Text-Processing
根據開始和結束 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個文件:
分割:
<?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
這會產生兩個文件
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>