두 개의 서로 다른 태그를 기반으로 txt 파일을 구문 분석합니다.

두 개의 서로 다른 태그를 기반으로 txt 파일을 구문 분석합니다.

아래와 같이 txt 파일을 구문 분석해야 합니다. 구문 분석해야 하는 부분은 "SASN2010Aber.CallEventRecord.egsnPDPRecord"로 시작하고 텍스트는 두 괄호 사이에 있습니다 {...}. 키 텍스트 길이가 일정하지 않아 위치를 기준으로 구문 분석할 수 없습니다. 이러한 라인 그룹을 구문 분석하고 분리하는 방법은 무엇입니까?

SASN2010Aber.CallEventRecord.egsnPDPRecord

{

    recordType : '70'D
    chargingID : '306457009'D
    sgsnAddress
    {
        Address : 'FBDC'H
    }
    pdpType : 'F121'H
    dynamicAddressFlag : '1'D
    listOfTrafficVolumes
    {
        [0]
        {
            changeTime : '1412031353342B0200'H
        }
    }
    duration : '0'D
    causeForRecClosing : '0'D
    recordSequenceNumber : '1'D
    rATType : '1'D
    listOfServiceData
    {
        [0]
        {
            ratingGroup : '4'D
            resultCode : '4010'D
            timeUsage : '0'D
            timeOfReport : '1412031353342B0200'H
            failureHandlingContinue : '0'D
            serviceIdentifier : '404'D
        }
    }

}

SASN2010Aber.CallEventRecord.egsnPDPRecord

{

    recordType : '70'D
    chargingID : '306457009'D
    sgsnAddress
    {
        Address : 'FBDC'H
    }
    pdpType : 'F121'H
    dynamicAddressFlag : '1'D
    listOfTrafficVolumes
    {
        [0]
        {
            changeTime : '1412031353342B0200'H
        }
    }
    causeForRecClosing : '0'D
    rATType : '1'D
    listOfServiceData
    {
        [0]
        {
            ratingGroup : '4'D
            resultCode : '4010'D
            failureHandlingContinue : '0'D
            serviceIdentifier : '404'D
        }
        [1]
        {
            ratingGroup : '4'D
            resultCode : '4010'D
            failureHandlingContinue : '0'D
            serviceIdentifier : '404'D
        }

    }
}

SASN2010Aber.CallEventRecord.egsnPDPRecord

{

    sgsnAddress
    {
        Address : 'FBDC'H
    }
    pdpType : 'F121'H
    listOfTrafficVolumes
    {
        [0]
        {
            changeTime : '1412031353342B0200'H
        }
    }
    duration : '0'D
    listOfServiceData
    {
        [3]
        {
            ratingGroup : '4'D
            resultCode : '4010'D
            timeUsage : '0'D
            serviceIdentifier : '404'D
        }
    }
}

답변1

하나 있다명령은 다음과 같습니다.

awk 'NR!=1{print RS$0 >"file"i++}' RS='SASN2010Aber.CallEventRecord.egsnPDPRecord' infile
  • NR!=1첫 번째 빈 레코드를 건너뜁니다 .
  • RS='...'SASN2010Aber.CallEventRecord.egsnPDPRecord~로써 정의 된오른쪽에코코드에스쪼개는 도구
  • 그리고 블록은 print RS$0 >"file"i++각 레코드( )를 , 및 (위 OP의 예제 입력에 있는 3개 파일) $0이라는 3개의 개별 파일에 저장합니다.file0file1file2
  • i++생성되는 파일 수를 늘리는 데 사용됩니다.
  • infile사용할 입력 파일의 이름이 됩니다 awk.

관련 정보