免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 14672 | 回复: 44
打印 上一主题 下一主题

请高手帮忙一个关于程序优化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-20 10:55 |只看该作者 |倒序浏览
主要是处理计费话单,文件大的话达到500万行,可用的话单大概8万条左右,我的思路是将原始话单按照个人需要的计费类别进行分割,每2000个需要的记录生成一个文件,然后再在这些文件中按照每一条记录再生成1999个文件,最终提取所需要的字段,感觉执行起来非常慢,麻烦各位帮小弟看一下了,谢谢先。附上原始程序和部分话单
程序执行:./bill_main.sh test.data
----------------------------------
bill_main.sh
#!/bin/sh
rm -fr tmp_file/Bill_RPT.txt
v_file_in=$1
./bill_pre.sh $1
file_total=`ls -l file*|wc|awk '{print $1}'`
j=1
for i in `ls file*`
do
echo "There Are Total $file_total Raw Records,Current Executing Record is $j"
./bill_body.sh $i
let j=$j+1
done
rm -fr file*  row_test*
------------------------------------
bill_pre.sh
#!/bin/sh
v_file_input=$1
rm -fr file* row_$v_file_input
v_rows=`grep "CDR GATE" $v_file_input |wc -l`
v_rows_total=`cat $v_file_input |wc -l`
v_times=`expr $v_rows / 2000`
grep -n "CDR GATE" $v_file_input >row_$v_file_input
i=0
init_rows=0
v_rows_start=1
while [ $i -lt $v_times ]
do
let i=$i+1
init_rows=`expr $init_rows + 2000`
v_rows_end=`cat row_$v_file_input|head -n $init_rows|tail -n 1|awk -F":" '{print $1}'`
v_rows_end_tmp=`expr $v_rows_end - 1`
sed -n "$v_rows_start,$v_rows_end_tmp"p $v_file_input>"file"$i
v_rows_start=$v_rows_end
done
sed -n "$v_rows_start,$v_rows_total"p $v_file_input>fileLast
----------------------------------
bill_body.sh
#!/bin/sh
v_file_in=$1
dos2unix -q $1
rm -fr tmp_file/Raw*
rm -fr tmp_file/Result.txt
awk -F" " 'begin{i=0}{if($0~/^[0-9]+ CDR GATE/){i=i+1}else print $0>>"tmp_file/Raw1_"i".txt"}' $1
cd tmp_file
for i in `ls Raw1_*`
do
v_callingNumber_tmp=`sed -n '/callingNumber{/,/\}/p' $i|grep -i "isdn="|awk -F"=" '{print $2}'|head -1|sed 's/\n//g'`
v_calledNumber=`sed -n '/calledNumber{/,/\}/p' $i|grep -i "isdn="|awk -F"=" '{print $2}'|head -1|sed 's/\n//g'`
v_RedirNumber=`sed -n '/RedirNumber{/,/\}/p' $i|grep -i "isdn="|awk -F"=" '{print $2}'|head -1|sed 's/\n//g'`
v_timeForAnswer=`grep -i 'timeForAnswer' $i|awk -F"=" '{print $2}'|sed 's/[-: ]//g'|head -1|sed 's/\n//g'`
v_timeForRelease=`grep -i 'timeForRelease' $i|awk -F"=" '{print $2}'|sed 's/[-: ]//g'|head -1|sed 's/\n//g'`
v_incomingTKGP=`grep -i 'incomingTKGP' $i|awk -F"=" '{print $2}'|head -1|sed 's/\n//g'`
v_outgoingTKGP=`grep -i 'outgoingTKGP' $i|awk -F"=" '{print $2}'|head -1|sed 's/\n//g'`
v_callDuration=`grep -i 'callDuration' $i|awk -F"=" '{print $2}'|awk -F"(" '{print $1}'|head -1|sed 's/\n//g'`
v_callingNumber=`echo ${v_RedirNumber:-$v_callingNumber_tmp}|sed 's/\n//g'`
echo "$v_callingNumber|$v_calledNumber|$v_timeForAnswer|$v_timeForRelease|$v_callDuration|$v_incomingTKGP|$v_outgoingTKGP">>Result.txt
done
dos2unix -q Result.txt
sed '/||||||/d' Result.txt >>Bill_RPT.txt
rm -fr Raw* Result.txt
-----------------------------------------------------------------
附上部分test.data
Format: (3G ZTE V3.2)
                    Begin -- 2010-02-10 09:20:02
                    End   -- 2010-02-10 10:20:00
================================================================================
70 CDR GATEIN={
   RecordType=0(GATEIN)
   sequenceNumber=5465972
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=13882026257832
   }
   calledNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=58309256
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=460030934020061213
   }
   incomingTKGP=1156
   outgoingTKGP=1031
   inTrunkGpModule=10
   outTrunkGpModule=0
   timeForSeizeChannel=2010-02-10 09:49:14
   timeForAnswer=2010-02-10 09:49:36
   timeForRelease=2010-02-10 09:49:59
   callDuration=23(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=10
      SequenceNo=1335006
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0000
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------
70 CDR GATEIN={
   RecordType=0(GATEIN)
   sequenceNumber=5465973
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=15870560053381
   }
   calledNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=57650985
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=4600300934021116100
   }
   incomingTKGP=1156
   outgoingTKGP=1031
   inTrunkGpModule=10
   outTrunkGpModule=0
   timeForSeizeChannel=2010-02-10 09:48:27
   timeForAnswer=2010-02-10 09:48:38
   timeForRelease=2010-02-10 09:49:59
   callDuration=81(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=10
      SequenceNo=1334339
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0000
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------
70 CDR GATEIN={
   RecordType=0(GATEIN)
   sequenceNumber=5465974
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=13628266001111818
   }
   calledNumber{
      AddInd=H'4
      NumPlan=H'1
      ISDN=72009738
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=46003093402600100
   }
   incomingTKGP=1156
   outgoingTKGP=1032
   inTrunkGpModule=10
   outTrunkGpModule=0
   timeForSeizeChannel=2010-02-10 09:49:36
   timeForAnswer=2010-02-10 09:49:45
   timeForRelease=2010-02-10 09:49:59
   callDuration=14(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=10
      SequenceNo=1335350
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0102
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------
70 CDR GATEIN={
   RecordType=0(GATEIN)
   sequenceNumber=5465975
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=158260025566723
   }
   calledNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=72146103
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=4600300093664026100
   }
   incomingTKGP=1156
   outgoingTKGP=1032
   inTrunkGpModule=10
   outTrunkGpModule=0
   timeForSeizeChannel=2010-02-10 09:49:09
   timeForAnswer=2010-02-10 09:49:18
   timeForRelease=2010-02-10 09:50:00
   callDuration=42(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=10
      SequenceNo=1334937
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0102
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------
71 CDR GATEOUT={
   RecordType=1(GATEOUT)
   sequenceNumber=5465976
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=0235893220021859
   }
   calledNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=13668463127
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=46003093224026100
   }
   incomingTKGP=1032
   outgoingTKGP=1156
   inTrunkGpModule=0
   outTrunkGpModule=10
   timeForSeizeChannel=2010-02-10 09:49:02
   timeForAnswer=2010-02-10 09:49:26
   timeForRelease=2010-02-10 09:50:00
   callDuration=34(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=14
      SequenceNo=831460
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0102
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------

论坛徽章:
0
2 [报告]
发表于 2010-02-20 11:02 |只看该作者
我感觉主要是这一条太耗资源
awk -F" " 'begin{i=0}{if($0~/^[0-9]+ CDR GATE/){i=i+1}else print $0>>"tmp_file/Raw1_"i".txt"}' $1

论坛徽章:
0
3 [报告]
发表于 2010-02-20 11:20 |只看该作者
请帮忙一下,谢谢了

论坛徽章:
0
4 [报告]
发表于 2010-02-20 13:38 |只看该作者
你能不能说下你要实现什么效果呢?比如就你那个文件的原始内容,然后你在给个你想实现内容的效果
改你的脚本不如自己写。说说你的需求吧

论坛徽章:
0
5 [报告]
发表于 2010-02-20 15:04 |只看该作者
每条记录以“--------------------------------------------------------------------------------”分隔,要求获取每条记录里面的callingnumber,就上面的原始数据而言,想得到如下结果:
13882026257832
15870560053381
13628266001111818
158260025566723
0235893220021859

论坛徽章:
0
6 [报告]
发表于 2010-02-20 15:29 |只看该作者
写了一个看看是否是你的意思
#awkfile
BEGIN { FS = "=" ; n = 0 }
{
  
   if ( $0 ~ /callingNumber/ ){
          n = NR
          n +=3
}
   if ( NR == n ){

    print $2
    print "-------------------"
    n = 0
}
}

awk -f awkfile yourfile

论坛徽章:
0
7 [报告]
发表于 2010-02-20 22:00 |只看该作者
回复 6# iori809


谢谢您的回复,我按你的程序重新修改了一下,但是不对头,麻烦帮忙看一下:
#awkfile
BEGIN { FS = "=" ; n = 0; m=0 }
{
   if ( $0 ~ /71 CDR GATEOUT={/ ) {
          n = NR
          m = NR
          n +=6
          m +=39
   }
   if ( NR == n ) {
      init_value = $2
      n=0
   }
   if ( NR == m ){
    redir_value = $0
    if( $redir_value ~/ISDN=/){
    print $2
    }
    else{
    print init_value
    }
    m=0
   }
}
我想如果第39行遇到ISDN=的话,我用39行的内容代替第6行的内容,否则还是输出第6行的内容,但是结果老是少了很多记录,麻烦告知小弟一下该怎么修改,谢谢。

论坛徽章:
0
8 [报告]
发表于 2010-02-20 22:05 |只看该作者
没看明白~ 你把要的结果列出来看看吧。 原始文件不变对吗

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2010-02-20 22:10 |只看该作者
长篇?

论坛徽章:
0
10 [报告]
发表于 2010-02-20 22:35 |只看该作者
本帖最后由 d_jacky 于 2010-02-20 22:41 编辑

原始文件如下:
70 CDR GATEIN={
   RecordType=0(GATEIN)
   sequenceNumber=16878990
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=13896753726
   }
   calledNumber{
      AddInd=H'4
      NumPlan=H'1
      ISDN=18996826667
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=460030934044526100
   }
   incomingTKGP=1154
   outgoingTKGP=1041
   inTrunkGpModule=8
   outTrunkGpModule=0
   timeForSeizeChannel=2010-02-14 23:49:49
   timeForAnswer=2010-02-14 23:50:04
   timeForRelease=2010-02-14 23:51:20
   callDuration=76(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=8
      SequenceNo=2568567
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0000
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
   RedirNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=13896577522
   }
}
--------------------------------------------------------------------------------
71 CDR GATEOUT={
   RecordType=1(GATEOUT)
   sequenceNumber=16878991
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=02357919393
   }
   calledNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=13996415008
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=46003093402612100
   }
   incomingTKGP=1031
   outgoingTKGP=1158
   inTrunkGpModule=0
   outTrunkGpModule=12
   timeForSeizeChannel=2010-02-14 23:49:00
   timeForAnswer=2010-02-14 23:49:11
   timeForRelease=2010-02-14 23:51:20
   callDuration=129(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=24
      SequenceNo=384981
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0102
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------
71 CDR GATEOUT={
   RecordType=1(GATEOUT)
   sequenceNumber=16878992
   callingNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=02358227313
   }
   calledNumber{
      AddInd=H'2
      NumPlan=H'1
      ISDN=15111990850
   }
   mscNumber{
      AddInd=H'1
      NumPlan=H'6
      ISDN=46003093403426100
   }
   incomingTKGP=1031
   outgoingTKGP=1155
   inTrunkGpModule=0
   outTrunkGpModule=9
   timeForSeizeChannel=2010-02-14 23:50:12
   timeForAnswer=2010-02-14 23:50:26
   timeForRelease=2010-02-14 23:51:21
   callDuration=55(seconds)
   partialOutputRecNum=0
   lastPartialOutput(The last CDR)
   callReference{
      Module=27
      SequenceNo=385631
   }
   causeForTermination=0(Normal Release)
   diagnostics=H'0000
   chargedParty=0(Originator Charged)
   IsPulseChargeSup=0
}
--------------------------------------------------------------------------------
要求显示的结果为:
13896577522
02357919393
02358227313
也就是某条记录如果存在redirnumber的话,就取redirnumber的isdn,不取callingnumber中的isdn
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP