![根据两个不同的标签解析txt文件](https://linux22.com/image/61263/%E6%A0%B9%E6%8D%AE%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E6%A0%87%E7%AD%BE%E8%A7%A3%E6%9E%90txt%E6%96%87%E4%BB%B6.png)
我需要解析一个 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命令如下:
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++
将每个记录($0
)保存到3个单独的文件中,其名称为file0
,file1
以及file2
(上面OP的示例输入中的3个文件)。 i++
用于增加创建文件的数量。infile
将是您的输入文件的名称,以使用awk
.