免费注册 查看新帖 |

Chinaunix

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

2G 文件找出出现次数最多的前10个 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-15 00:01 |只看该作者 |倒序浏览
本帖最后由 qqjue 于 2010-06-15 00:04 编辑

上次发贴只是带着对bash有疑惑有"不满".解决不了我想要解决的问题.所以总有点抵触,为此不想在BASH上下功夫,看了几天perl,最后觉得这样有点偏了,我是学linux的.不是学编程的.虽然学了perl会对日常维护有帮助,但就整个shell,我们也只学了5天而已,这不是重点,只是基础的一小部分.我们学习的进度很快,常用命令,shell,dhcp,httpd,namd,samba,vsftpd,troubleshooting,U盘LINUX,无人值守安装,无盘linux,智能DNS....今天放假,没去上课,有时间刚好解决了以前一直困绕着我的一个问题. 就是一个2G的文件,找出里面出现次数最多的前10个单词.
  如果是找英文单词, 先用
  1. sed -i 's/[^a-Z]/ /g' filename
复制代码
如果处理的中文 先用
  1. export LANG=zh_CN.UTF8 sed -i 's/./& /g' filename
复制代码
然后用awk 处理 代码如下
  1. BEGIN{
  2. top=15
  3. }

  4. { for (i=1;i<=NF;i++) statistic[$i]++}
  5. END{
  6. for (i=1;i<=top;i++) {max[i]=0;words[i]=""}
  7. for (word in statistic)
  8.         {
  9.         for (i=1;i<=top;i++)
  10.         { if (statistic[word]>max[i])
  11.                 {
  12.                   for(j=top;j>i;j--)
  13.                      {max[j]=max[j-1];
  14.                       words[j]=words[j-1];
  15.                       }
  16.                    max[i]=statistic[word];
  17.                    words[i]=word;
  18.                    break
  19.                   }
  20.         }
  21.         }
  22. for(i=1;i<=top;i++) print i"---->"words[i]":"max[i]
  23. }
复制代码
处理 250M文件 用时20秒. 2G的估计5分钟左右就能搞定.shell 只是linux中的一部分,虽然它很重要,但也没必要在这个上面浪费太多精力.还有很多东西可以去钻研.高级路由,SQL,系统调优,最后的难点是集群!!

评分

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

查看全部评分

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2010-06-15 00:06 |只看该作者
我怀疑5分钟左右搞不定2G的数据,能否劳驾楼主测试一下?

论坛徽章:
0
3 [报告]
发表于 2010-06-20 09:20 |只看该作者
回复 1# qqjue


    这个我记得以前有本书里介绍过~忘了怎么写了,不过效率不错~
LZ一看就是想全方面发展的~加油吧

论坛徽章:
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
4 [报告]
发表于 2010-06-20 09:27 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2010-06-21 11:21 |只看该作者
上次发贴只是带着对bash有疑惑有"不满".解决不了我想要解决的问题.所以总有点抵触,为此不想在BASH上下功夫, ...
qqjue 发表于 2010-06-15 00:01

楼主自信满满那
用的了这么复杂么

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2010-06-21 11:45 |只看该作者
回复 5# xuledw


你给个简单的让大家学一下吧^_^

论坛徽章:
0
7 [报告]
发表于 2010-06-21 12:16 |只看该作者
讨论两个问题:
1、中文单词的问题,“我爱吃苹果皮”,这一句是6个单词,还是5个单词,还是4个?
2、单词分行怎么判断?
  1. How ol
  2. d are you
复制代码
书写不规范?old后无空格
  1. How old
  2. are you
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2010-06-21 12:22 |只看该作者
丑陋的 awk 脚本,
如果换做是 Perl,直接就有现成的了吧。
http://search.cpan.org/~gavinc/List-MRU-0.04/MRU.pm

my $mru = new List::MRU( max => 20 );
foreach my $word ( ...... ){
    $mru->add( $word );
}

foreach my $item ( $mru->list ) {
    print "$item\n";
}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-06-21 12:26 |只看该作者
我是学linux的.不是学编程的

论坛徽章:
0
10 [报告]
发表于 2010-06-21 14:07 |只看该作者
谁说最难的是集群?LZ学了就知道了。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP