분할을 사용하여 파일을 세그먼트로 분할할 수 있습니까? 각 세그먼트의 크기는 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에는 항목이 하나만 포함되어 있습니다.
<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>