免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sthcf
打印 上一主题 下一主题

新手的烦恼--文件处理的效率问题[已解决] [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-12-15 17:08 |只看该作者
20081204 23:23:05 [INFO ](2875556) 解析清单 [ 13556409826 | SC | 01 | 4 | 00001 | | B| 15 | | 1 | 05 | N | 0]! FILE:[RealBill
Operator.cpp],LINE:[115]
20081204 23:23:05 [INFO ](2875556) 转换后帐单科目: 2020 FILE:[RealBillOperator.cpp],LINE:[119]
20081204 23:23:05 [INFO ](2875556) 普通单 FILE:[RealBillOperator.cpp],LINE:[244]
20081204 23:23:05 [INFO ](2875556) Ebox Info:[0~4819~0~0~0~0~0~0] FILE:[RB_Woff.cpp],LINE:[140]
20081204 23:23:05 [INFO ](2875556) After Woff Ebox Info:[0~4804~0~0~0~0~0~0] FILE:[RB_Woff.cpp],LINE:[739]
20081204 23:23:05 [INFO ](2875556) 销帐结果 : [7544002264722 | 0 | 4804 | 0 | 0 ] FILE:[RealBillOperator.cpp],LINE:[304]

粗体部分是想要的内容,然后组合成新的行,各个值之间用新的分隔符分开

论坛徽章:
0
12 [报告]
发表于 2008-12-15 17:13 |只看该作者
因我对shell不熟悉,勉强写了个脚本处理,里面用了几个循环,这可能是导致效率低的原因,脚本稍长,要麻烦各位高手看一下了,看是否有方法提高效率,谢谢!


#!/bin/sh

#############################################
#$1是传进来的第参数,即是要待处理的文件,为压缩文件
#############################################
do_000log='/ftp/hcf/do_list_log000.txt'
put_log='/ftp/hcf/'$1'mput_log.txt'
#do_000log='do_list_log000.txt'
FILE_tmp_log=$1'_tmp_log'
date > $FILE_tmp_log
echo $1 >> $FILE_tmp_log

##########################
#读数据的原路径,处理完之后的备份数据
#########################

source_path='/ftp/hcf/'
#source_path='/ftp/woffcust/'
goal_path1='/ftp/woffcust_backup/'
goal_path2='/ftp/realbill_backup/'


#cd $source_path

count_num=1
TransferNum =""

########################
#传进来的第一个参数
########################

FILE=$source_path$1

###############################################
#生成对应的文件名
##############################################

FILE_UN=$FILE'_UN'
FILE_result=$FILE'_result'
#FILE_TMP_TWO=$FILE'_TMP_TWO'
FILE_TMP=$FILE'_TMP'
c_time=$(date +%Y%m%d%H%M%S)
mput_name='log.Z_'$(date +%Y%m%d)
FILE_CTIME=$FILE'_'$c_time

#############################################
#用到的中间变量
#############################################

FILE_VA1=""
FILE_VA2=""
FILE_VA_TMP=""

###########################################
#长单普通单的解析规则
###########################################

substring1="解析清单"
substring2="转换后帐单科目:"
substring3="普通单 FILE:"
substring33="长单 FILE:"
substring4="Ebox Info:"
substring5="After Woff Ebox Info:"
substring6="销帐结果"
substring=""


zcat $FILE|awk -F '|' ' ! (/解析清单/ && $8+0 == 0  ){print $0}' >$FILE_UN
#cat $FILE > $FILE_UN
#exec < $FILE_UN
while read LINE
do
#################################################
#该case只能读到6个关键字,另一个关键字下面直接用
#################################################

case $count_num in
        1) substring=$substring1
        ;;
        2) substring=$substring2
        ;;       
        3) substring=$substring3
        ;;       
        4) substring=$substring4
        ;;       
        5) substring=$substring5
        ;;       
        6) substring=$substring6
        ;;
        *)
        ;;
esac

#############################################################
#第2、4、6三行的关键字判断
############################################################

if [ $count_num -gt 1 ] && [ $count_num -lt 6 ] && [ $count_num -ne 3 ]; then
        if [[ $LINE == *$substring*  ]];  then
                echo $LINE > $FILE_TMP
                #echo $LINE >> err1.log
                case $count_num in
                        2)FILE_VA1=`awk '{print $6}' $FILE_TMP`
                        FILE_VA_TMP=$FILE_VA_TMP'|'$FILE_VA1'|3'
                        #echo $FILE_VA_TMP
                        ;;
                        4)FILE_VA1=`awk -F \[ '{print $3}' $FILE_TMP|awk -F \] '{print $1}'|awk -F \~ '{OFS="|";print $1,$2,$3,$4,$5,$6,$7,$8}'`
                        FILE_VA_TMP=$FILE_VA_TMP'|'$FILE_VA1'|0|0'
                        #echo $FILE_VA_TMP
                        ;;
                        5)FILE_VA1=`awk -F \[ '{print $3}' $FILE_TMP|awk -F \] '{print $1}'|awk -F \~ '{OFS="|";print $1,$2,$3,$4,$5,$6,$7,$8}'`
                        FILE_VA_TMP=$FILE_VA_TMP'|'$FILE_VA1'|0|0'
                        #echo $FILE_VA_TMP
                        ;;
                        *)
                        ;;
                esac
               
                count_num=`expr $count_num + 1`
        elif [[ $LINE == *$substring1*  ]];  then
                echo $LINE > $FILE_TMP
                #cat err1.log >>err2.log
                #echo $LINE > err1.log
                FILE_VA1=`awk -F \[ '{print $1}' $FILE_TMP`
                FILE_VA2=`awk -F \[ '{print $3}' $FILE_TMP|awk -F '|' '{OFS="|";print $1,$8}'`
                FILE_VA_TMP=$FILE_VA1'|'$FILE_VA2
                count_num=2
        else
                 
                count_num=1
        fi
#############################################################
#第1行的关键字判断
############################################################

elif [ $count_num -eq 1 ]; then
        if [[ $LINE == *$substring*  ]];  then
                echo $LINE > $FILE_TMP
                #echo $LINE > err1.log
                FILE_VA1=`awk -F \[ '{print $1}' $FILE_TMP`
                FILE_VA2=`awk -F \[ '{print $3}' $FILE_TMP|awk -F '|' '{OFS="|";print $1,$8}'`
                FILE_VA_TMP=$FILE_VA1'|'$FILE_VA2
                #echo $FILE_VA_TMP
                count_num=`expr $count_num + 1`
        else
                #echo $LINE >> err2.log
                count_num=1
        fi
#############################################################
#第3行的关键字判断
############################################################

elif [ $count_num -eq 3 ]; then
        if [[ $LINE == *$substring*  ]]||[[ $LINE == *$substring33* ]];  then
                count_num=`expr $count_num + 1`
        else
                #echo $LINE >> err2.log
                count_num=1
        fi
#############################################################
#第6行的关键字判断
############################################################

elif  [ $count_num -eq 6 ]; then
        if [[ $LINE == *$substring*  ]];  then
                echo $LINE > $FILE_TMP
                FILE_VA1=`awk -F \[ '{print $3}' $FILE_TMP|awk -F '|' '{OFS="|";print $1,$3}'`
                FILE_VA_TMP=$FILE_VA_TMP'|'$FILE_VA1
                echo $FILE_VA_TMP >> $FILE_result
                count_num=1
                FILE_VA_TMP=""
        elif [[ $LINE == *$substring1*  ]];  then
                echo $LINE > $FILE_TMP
                #cat err1.log >>err2.log
                #echo $LINE > err1.log
                FILE_VA1=`awk -F \[ '{print $1}' $FILE_TMP`
                FILE_VA2=`awk -F \[ '{print $3}' $FILE_TMP|awk -F '|' '{OFS="|";print $1,$8}'`
                FILE_VA_TMP=$FILE_VA1'|'$FILE_VA2
                count_num=2
        else
                #echo $LINE >> err1.log
                #cat err1.log >>err2.log
                count_num=1
        fi
else
        count_num=1
fi

done < $FILE_UN

#exec > /dev/null

#############################################################
#解析后的文件处理
############################################################

sed 's/ *| */|/g' $FILE_result|awk -F '|' '{OFS="|"; print $2,$26,$1,$5,$4,$3,\
$6+$7+$8+$9+$10+$11+$12+$13+$14+$15+0-$16-$17-$18-$19-$20-$21-$22-$23-$24-$25,\
$6+$7+$8+$9+$11+$12+$14+$15+0-$16-$17-$18-$19-$21-$22-$24-$25,\
$10+$13+0-$20-$23,$16+$17+$18+$19+$21+$22+$24+$25+0,$20+$23+0,$6+$7+$8+$9+$11+$12+$14+$15+0,$10+$13+0,\
$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25"|"}' > $FILE_CTIME

#############################################################
#各字段规则说明
############################################################



#############################################################
#删除中间数据
############################################################
rm $FILE_UN
rm $FILE_result
rm $FILE_TMP


#######################################################################
#在这里配置上FTP,FTP完成后压缩搬到备份文件夹,并把源文件也搬到备份目录
#######################################################################

#put_log='/ftp/hcf/'$1'mput_log.txt'

if [ -s $put_log ]; then
rm $put_log
TransferNum =""
fi

#begin ftp
#ftp -n -i -v << ! > $put_log
#open IP
#user username   passowrd
#binary
#prompt
#mput hcf.log
#bye
#!

if [ -s $put_log ]
then
        TransferNum=`awk '/^226/'  $put_log'`
        if [  $TransferNum =="" ]
        then
                echo "ftp failed!" >> $FILE_tmp_log
        else
                echo "ftp success!" >> $FILE_tmp_log
                #mv $1 $goal_path1
                #mv $FILE_CTIME  $goal_path2
                cp $1 $goal_path1
                cp $FILE_CTIME  $goal_path2
        fi        
fi

date >> $FILE_tmp_log
cat $FILE_tmp_log >> $do_000log
rm $FILE_tmp_log

论坛徽章:
0
13 [报告]
发表于 2008-12-15 17:15 |只看该作者
把各行的判断及处理放到第一个case判断里否能提高一些效率?

论坛徽章:
0
14 [报告]
发表于 2008-12-15 17:22 |只看该作者
关键字是解析清单咯?
然后加上后面的5行?
格式固定不?
如果是固定的,用awk很容易了

论坛徽章:
0
15 [报告]
发表于 2008-12-15 17:44 |只看该作者
原帖由 nuclearxin 于 2008-12-15 17:22 发表
关键字是解析清单咯?
然后加上后面的5行?
格式固定不?
如果是固定的,用awk很容易了


我给的那个是要的内容,连续6行符合那个关键字的要求,如果少了一行的内容就不符合了,就要去掉,只选 出符合要求的

论坛徽章:
0
16 [报告]
发表于 2008-12-15 17:53 |只看该作者
天啊,这么长,效率不低才怪。
等下,我用正则表达式,应该三个命令、一行就可以搞定了,不过估计有点复杂。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
17 [报告]
发表于 2008-12-15 17:54 |只看该作者

回复 #16 walkerxk 的帖子

不许用perl

论坛徽章:
1
2015年亚洲杯之韩国
日期:2015-04-24 09:07:02
18 [报告]
发表于 2008-12-15 17:56 |只看该作者
楼主的文本不都是这么连续6行的呗?只有当这六行连续在一起时 才提取呗?

论坛徽章:
1
2015年亚洲杯之韩国
日期:2015-04-24 09:07:02
19 [报告]
发表于 2008-12-15 17:57 |只看该作者

回复 #17 ly5066113 的帖子

哈哈

论坛徽章:
0
20 [报告]
发表于 2008-12-15 18:28 |只看该作者
原帖由 ly5066113 于 2008-12-15 17:54 发表
不许用perl

这都被你发现了,好吧,不用perl。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP