免费注册 查看新帖 |

Chinaunix

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

分享----awk版折半查找 [复制链接]

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-02 15:46 |只看该作者 |倒序浏览
本帖最后由 expert1 于 2010-10-02 19:47 编辑

假期看算法,想到了这个,平时我们需要找出2个文件里相同的部分,假如a内容是排序后的。比如
10
20
30
40
50
50
60
70
而b:
15
10
70
45
300
50
找出a,b中公共的部分,一般做法
  1. awk 'NR==FNR{a[$0]}NR>FNR{if($0 in a)print }'
复制代码
缺点是,当a数量大的时候逐个比较,效率低,类似mysql的全表扫描(无索引)。

下午搞了个二分查找
  1. #!/bin/awk -f
  2. # date :2010-10-02
  3. # binary search by awk ,just for fun

  4. NR==FNR {
  5.         a[k++] = $0 }

  6. NR>FNR {

  7.     start= 0;end = k-1
  8. while(start<= end) {

  9.                 mid =int(start+ ((end - start)/2))
  10. #start,end都很大时,比如元素达到 2^30 时,平常做法mid =int((start+ end)/2)将超过整数的最大值 2^31 -1,此时讲溢 #出,值为负了。所以要用这个办法,O(∩_∩)O~

  11.                 split(a[mid], b)
  12.                
  13.                 if($1==b[1]) {print "ok "$1 " was found";break}

  14.                 else if ($1 > b[1]) start = mid+1

  15.                 else end= mid-1   }
  16.                        
  17.          }
复制代码
用法:awk -f binarysearch.awk a b
此时a必须是排序过的,当然这些废话了,学过数据结构的都晓得为什么。

效率很高,呵呵,当然数据量小的时候看不出来,有兴趣可以去看下这个算法。

经过多次测试没发现问题。有问题欢迎回复。

突然想起了以前我发的一个贴“shell的效率和Perl,Python处理文本方面谁高”现在想起真是感觉自己浅薄了,根据具体情况,采取合适的方法(算法)。想起了当时一片争论,大家各执一词,当然没几个人说得清为什么,呵呵,做事不可不严谨啊。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
2 [报告]
发表于 2010-10-02 15:49 |只看该作者
本帖最后由 expert1 于 2010-10-02 15:50 编辑

用处之一:在一个10G的日志文件里,找出某天的某个时间段的日志内容。

日志格式大概是:2010 Oct 2 15:49 00 日志内容

不妨用这个办法搞哈哈。至于咋搞,开动脑子呵呵。

其他的发挥你的想象力吧,若是大文件非常需要效率的时候不妨参考一下哈哈

论坛徽章:
0
3 [报告]
发表于 2010-10-04 00:41 |只看该作者
回复 2# expert1


   恩?怎么没人顶!!!

论坛徽章:
0
4 [报告]
发表于 2010-10-04 12:47 |只看该作者
旁观学习

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-10-05 09:15 |只看该作者
传说中的二分法?

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
6 [报告]
发表于 2010-10-08 09:10 |只看该作者

论坛徽章:
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
7 [报告]
发表于 2010-10-08 09:31 |只看该作者
回复 6# expert1


    方向变了?C,算法。

加油!

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
8 [报告]
发表于 2010-10-08 09:41 |只看该作者
回复 7# blackold


    无聊看着玩的了。

论坛徽章:
0
9 [报告]
发表于 2010-10-09 12:51 |只看该作者
眼看着你就虚幻起来了

评分

参与人数 1可用积分 +9 收起 理由
expert1 + 9

查看全部评分

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
10 [报告]
发表于 2010-10-09 13:17 |只看该作者
回复 9# bbgg1983


    你的积分怎么这么少了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP