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

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

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

관련 정보