2つの異なるタグに基づいてtxtファイルを解析します。

2つの異なるタグに基づいてtxtファイルを解析します。

以下のようにtxtファイルを解析する必要があります。解析する必要がある部分は「SASN2010Aber.CallEventRecord.egsnPDPRecord」で始まり、テキストは2つの括弧の間にあります{...}。キーテキストの長さが一定ではないため、場所に基づいて解析できません。これらの行グループを解析して分離する方法は?

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~として定義されたエココードS分割ツール
  • ブロックはprint RS$0 >"file"i++各レコード()を、および(上記のOPの例の入力にある3つのファイル)$0という3つの別々のファイルに保存します。file0file1file2
  • i++生成されるファイルの数を増やすために使用されます。
  • infile使用する入力ファイルの名前になりますawk

関連情報