
분할을 사용하여 파일을 여러 세그먼트로 분할할 수 있으며 각 세그먼트의 크기는 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
그러면 두 개의 파일이 생성 됩니다 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>