日期:2014-05-16  浏览次数:20656 次

一条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


还是下午的问题啊??这个应该满足吧。。。