시작 및 끝 XML 태그를 기반으로 파일 분할

시작 및 끝 XML 태그를 기반으로 파일 분할

분할을 사용하여 파일을 여러 세그먼트로 분할할 수 있으며 각 세그먼트의 크기는 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>

관련 정보