当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]
帖子发表于 : 2008-03-10 9:53 
头像

注册: 2007-10-19 14:51
帖子: 4953
地址: 深圳
送出感谢: 0 次
接收感谢: 2
现有一个文本文件:
引用:
0o9i8u7y
0ok9ij
0plmnko9
1
1
1
11
111
1111
11111
111111
123
12321
123321
12345
12345
123456
123456
123456
123www
1qa2ws
1qa2ws3ed
1qaz2wsx
1qaz2wsx3edc
1qwe23
21
24021988
2wsx3edc
31337
31338
321
4321
54321
5tgb6yhn
5tgb6yhn#P
654321
7654321
7yhn
87654321
987654321
a
aa
aa
aaron
aaron
abc123
abcd
abcd
abcd1234
abcd1234
...
怎么样快速统计每个单词的出现次数,并从高到低排序呢?

这里,单词的意思是:每一行的非空字符总和为一个单词。。


_________________
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'


最后由 yaoms 编辑于 2008-03-10 10:26,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-03-10 10:01 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
词?
sort?


_________________
● 鸣学


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-03-10 10:23 
头像

注册: 2007-10-19 14:51
帖子: 4953
地址: 深圳
送出感谢: 0 次
接收感谢: 2
哈哈,有办法了,来自yingfei的
引用:
awk '{arr[$1]+=1 }END{for(i in arr){print arr[i]"\t"i}}' FILE_NAME | sort -rn


_________________
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-03-10 12:40 

注册: 2006-08-15 20:35
帖子: 102
送出感谢: 0 次
接收感谢: 0 次
再给一个简单点的方法:
sort -rn FILENAME |uniq -c |sort -rn


_________________
我的bloghttp://www.liuzhongshu.com/
~ Tech、CodeGuitar、Design and my Life


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-03-10 12:42 
头像

注册: 2007-10-19 14:51
帖子: 4953
地址: 深圳
送出感谢: 0 次
接收感谢: 2
wenshu 写道:
再给一个简单点的方法:
sort -rn FILENAME |uniq -c |sort -rn


谢谢,真是太好了,越来越简洁


_________________
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-03-12 10:21 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
以为没用的事情。今天居然,分析数据,我也要用到了。


_________________
● 鸣学


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-03-12 10:24 
头像

注册: 2007-10-19 14:51
帖子: 4953
地址: 深圳
送出感谢: 0 次
接收感谢: 2
呵呵。怎么会没用。。。


_________________
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'


页首
 用户资料  
 
8 楼 
 文章标题 : Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]
帖子发表于 : 2011-05-08 13:03 

注册: 2008-03-28 16:53
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!


页首
 用户资料  
 
9 楼 
 文章标题 : Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]
帖子发表于 : 2011-05-08 13:17 
头像

注册: 2009-04-11 23:46
帖子: 4029
系统: Arch Linux
送出感谢: 11
接收感谢: 110
lu86391 写道:
如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!


计数排序。


_________________
我的博客 http://blog.lilydjwg.me/
Dropbox,你值得拥有。
提问的智慧
Arch Linux 中文论坛

我的vimrc: http://git.io/vimrc


页首
 用户资料  
 
10 楼 
 文章标题 : Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]
帖子发表于 : 2011-05-08 14:37 
头像

注册: 2010-10-17 18:23
帖子: 156
送出感谢: 0 次
接收感谢: 0 次
mark!


_________________
用起来还是蛮舒服的!
生命在于折腾!
为什么这个论坛复旦的人很少!!


页首
 用户资料  
 
11 楼 
 文章标题 : Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]
帖子发表于 : 2011-05-08 20:05 

注册: 2009-07-25 19:23
帖子: 297
送出感谢: 3
接收感谢: 0 次
这个东西挺经典的呢


_________________

Ubuntu 桌面培训- 全中文官方文档,含汉化截图,提供PDF


页首
 用户资料  
 
12 楼 
 文章标题 : Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]
帖子发表于 : 2011-05-11 13:54 

注册: 2008-03-28 16:53
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
lilydjwg 写道:
lu86391 写道:
如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!


计数排序。

用sort如果机器不太好,很有可能会内存不足,我自己写了一个小顶堆的算法脚本。
代码:
!/bin/bash
cat $* | awk -F '\n' '{
        logMap[$1]=logMap[$1] + 1;
}
END{
        for(s in logMap){
                print s" "logMap[s];
        }
}' > "temp"

#读入中间文件,使用小顶堆筛选结果
cat temp | awk -F ' ' '
function ArraySwap(arraySwap,idx1,idx2){
        temp=arraySwap[idx1];
        arraySwap[idx1]=arraySwap[idx2];
        arraySwap[idx2]=temp;
}
function HeapAdjust(arrayLog,logQuery,arrayNum,logNum){
        i=1;
        arrayNum[1]=logNum;
        arrayLog[1]=logQuery;
        while(i<=100){
                if(2*i+1<=100){
                        if(arrayNum[i]>arrayNum[2*i] || arrayNum[i]>arrayNum[2*i+1]){
                                if(arrayNum[2*i]<=arrayNum[2*i+1]){
                                        ArraySwap(arrayNum,i,2*i);
                                        ArraySwap(arrayLog,i,2*i);
                                        i=2*i;
                                }
                                else{
                                        ArraySwap(arrayNum,i,2*i+1);
                                        ArraySwap(arrayLog,i,2*i+1);
                                        i=2*i+1;
                                }
                        }
                        else{
                                break;
                        }
                }
                 else if(2*i<=100){                                                                               
                        if(arrayNum[i]>arrayNum[2*i]){                                                           
                                ArraySwap(arrayNum,i,2*i);                                                       
                                ArraySwap(arrayLog,i,2*i);                                                       
                                i=2*i;                                                                           
                        }                                                                                         
                        else{                                                                                     
                                break;                                                                           
                        }                                                                                         
                }                                                                                                 
                else{                                                                                             
                        break;                                                                                   
                }                                                                                                 
        }                                                                                                         
}                                                                                                                 
{                                                                                                                 
        siteNum++;                                                                                               
        if(siteNum%1000==0){                                                                                     
                print siteNum;                                                                                   
        }                                                                                                         
        userlog = $1;                                                                                             
        for(i=2; i<NF; i++){                                                                                     
                userlog= userlog" "$i;                                                                           
        }                                                                                                         
                                                                                                                 
        if($NF > heapNum[1]){                                                                                     
                HeapAdjust(heapLog,userlog,heapNum,$NF);                                                         
        }                                                                                                         
        total=total+$NF;                                                                                         
}                                                                                                                 
END{                                                                                                             
        for(i in heapNum){                                                                                       
                print heapNum[i],heapLog[i] > "result";                                                           
                topTotal=topTotal+heapNum[i];                                                                     
        }                                                                                                         
        print "TopLog Rate:",topTotal,total,topTotal/total;                                                       
}'                                                                                                               
sort -nr result -o rank                                                                                           
rm result


本人初学脚本,这是写的第二个脚本,有不足希望大牛多多指教 :em06


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 12 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译