一条shell老问题,请大家来帮帮忙啊!!
这个是一个txt文件,文件名:test.txt,其内容如下
Start of Data
**********************************************************************
Record (1) "EGSNPDPRecord"
"recordType" = "00E1"
"servedIMSI" = "455001131950438"
"ggsniPBinV4Address" = "116193008089"
"chargingID" = "72DF9D5B"
End of Record (1)
Record (2) "EGSNPDPRecord"
"recordType" = "00E1"
"servedIMSI" = "455001151010916"
"ggsniPBinV4Address" = "116193008089"
"chargingID" = "5B9DB29F"
End of Record (2)
Record (3) "EGSNPDPRecord"
.....
.....
.....
End of Record (3)
............
End of Record (120)
**********************************************************************
End of Data
注意:以上格式都是Record (..) "..." 直到 End of Record (..)结束,并且其中间的行数不一致
问题:使用Shell或者awk(必须要用到"Record"和"End of Record"这两个字符串做条件),将上述的文件转换成如下格式,写到一个文件,文件名另定
Result File:
00E1|455001131950438|116193008089|72DF9D5B
00E1|455001151010916|116193008089|5B9DB29F
.....
-------------------------------------
我的解决方案:
---简短的几条数据我还是可以弄出来,但是数据一多起来,我就没办法了。老是搞不对。
$ awk 'BEGIN{FS="\""}/= /{v[i++]=$4}END{print "Result File:";for(i=0;i<length(v);i++){if((i+1)%4)printf "%s|", v[i];else printf "%s\n", v[i]}}' test.txt
---这个方法是可以提取两块数据,然后可以排序,但是如果遇到值里面出现一个”符号的话,那就取值不准了,所以我想问下大家能不能帮我想想一以下这个方法:
当遇到Record开头就遍历开始读值,然后就一直检测,当遇到End of Record时候就打印成下列结果的格式,然后在进行下一块的读值呢?? ------我今天弄了半天了,都没实现。请大家帮帮忙。。!
------我谷歌,百度了一堆,还是没能解决,请大家出手帮忙!
shell
AWK
unix
------解决方案--------------------#!/bin/sh
awk 'BEGIN{FS="\"";flag=0}{
if($0~/^Record/)
{
flag=1
next
}
if($0~/^End/)
{
flag=0
printf("\n")
next
}
if(flag==1)
{
printf("%s
------解决方案--------------------
",$4)
}
}' test.txt
还是下午的问题啊??这个应该满足吧。。。