免费注册 查看新帖 |

Chinaunix

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

关于文件对比的效率问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-24 15:18 |只看该作者 |倒序浏览
RT,假设有两个文件A和B,都有好几千条数据,且每条数据的长度是固定的N。
有一个模板tmplate,定义了每条数据的第几个字段的起始字符位置以及长度,类似这种格式:
2   3   5
表示第2个字段是从第3个字符开始的5个字符。
在文件A和B中,第一个字段是关键字,假设A里面的第一个字段值为MF,那就需要到B中找到第一个字段为MF的记录,然后根据模板对字段的定义依次对比该记录的每个字段。

我之前的做法是先用读取A里面的一条记录grep找到B里面的记录,然后先整行对比A和B里面的记录,如果不同的话再按照template定义的逐字段对比。
代码如下:
while read source_rec
do
     dest_rec=`grep ${source_rec:0:2} fileB`  
     if [ "$source_rec" != "$dest_rec" ]
     then
     i=1
     while read tmp
     do
     field_name[$i]=`echo $tmp|awk '{print $2}'`
     field_loc[$i]=`echo $tmp|awk '{print $3}'`
     start_p[$i]=`echo $tmp|awk '{print $4}'`
     field_len[$i]=`echo $tmp|awk '{print $5}'`
     source_rec_value="${source_rec((${start_p[$i]}-1)){field_len[$i]}}"
     dest_rec_value="${dest_rec((${start_p[$i]}-1)){field_len[$i]}}"  
        if [ "$source_rec_value" != "$dest_rec_value" ]
        then
        echo -e "Filename $filename:\t$rec_type record ${field_name[$i]} value for ric $ric_value differs. \
        source value is "$source_rec_value";\tdest value is "$dest_rec_value >>Log
        fi
     let i+=1
     done<template
     fi
done <fileA

不过发现这种方法在数据量大的时候效率显得相当低下,不知道怎样能让对比更加高效。
awk里面可以用FIELDWIDTHS = "2 5 10 6 7 7 35" 这种方式把记录行一次分割成独立的字段,还没去实现,我想可能比之前的方法要好一些。
请高手指点。

论坛徽章:
0
2 [报告]
发表于 2009-04-24 15:41 |只看该作者
快来人啊,别沉了。

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
3 [报告]
发表于 2009-04-24 15:50 |只看该作者
无数据,无真像...

论坛徽章:
0
4 [报告]
发表于 2009-04-24 16:17 |只看该作者
没人能给个建议吗?

论坛徽章:
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
5 [报告]
发表于 2009-04-24 16:51 |只看该作者

回复 #4 fttskyblue 的帖子

搞不懂LZ要干吗?

举个例子吧,ls已经给建议了。

论坛徽章:
0
6 [报告]
发表于 2009-04-26 09:43 |只看该作者
a b 模板文件同时读 边读边处理

这样效率比你的高很多

awk支持用getline < "file"读取多个文件

论坛徽章:
0
7 [报告]
发表于 2009-04-26 09:54 |只看该作者
用纯shell脚本处理,效率是很低的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP