[问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

[问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

#1

帖子 yaoms » 2008-03-10 9:53

现有一个文本文件:
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
...
怎么样快速统计每个单词的出现次数,并从高到低排序呢?

这里,单词的意思是:每一行的非空字符总和为一个单词。。
上次由 yaoms 在 2008-03-10 10:26,总共编辑 1 次。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#2

帖子 eexpress » 2008-03-10 10:01

词?
sort?
● 鸣学
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

#3

帖子 yaoms » 2008-03-10 10:23

哈哈,有办法了,来自yingfei的
awk '{arr[$1]+=1 }END{for(i in arr){print arr"\t"i}}' FILE_NAME | sort -rn
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
wenshu
帖子: 102
注册时间: 2006-08-15 20:35
送出感谢: 0
接收感谢: 0

#4

帖子 wenshu » 2008-03-10 12:40

再给一个简单点的方法:
sort -rn FILENAME |uniq -c |sort -rn
我的bloghttp://www.liuzhongshu.com/
~ Tech、CodeGuitar、Design and my Life
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

#5

帖子 yaoms » 2008-03-10 12:42

wenshu 写了:再给一个简单点的方法:
sort -rn FILENAME |uniq -c |sort -rn
谢谢,真是太好了,越来越简洁
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙
送出感谢: 4 次
接收感谢: 256 次

#6

帖子 eexpress » 2008-03-12 10:21

以为没用的事情。今天居然,分析数据,我也要用到了。
● 鸣学
头像
yaoms
帖子: 4953
注册时间: 2007-10-19 14:51
来自: 深圳
送出感谢: 0
接收感谢: 2 次

#7

帖子 yaoms » 2008-03-12 10:24

呵呵。怎么会没用。。。
Nothing 有事请发邮件到 yms541 AT gmail.com
alias 爱慕颇雷尔='mplayer'
lu86391
帖子: 4
注册时间: 2008-03-28 16:53
送出感谢: 0
接收感谢: 0

Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

#8

帖子 lu86391 » 2011-05-08 13:03

如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

#9

帖子 lilydjwg » 2011-05-08 13:17

lu86391 写了:如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!
计数排序。
头像
HelloAndroid
帖子: 156
注册时间: 2010-10-17 18:23
送出感谢: 0
接收感谢: 0

Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

#10

帖子 HelloAndroid » 2011-05-08 14:37

mark!
用起来还是蛮舒服的!
生命在于折腾!
为什么这个论坛复旦的人很少!!
scutdk
帖子: 299
注册时间: 2009-07-25 19:23
送出感谢: 3 次
接收感谢: 0

Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

#11

帖子 scutdk » 2011-05-08 20:05

这个东西挺经典的呢

Ubuntu 桌面培训- 全中文官方文档,含汉化截图,提供PDF
lu86391
帖子: 4
注册时间: 2008-03-28 16:53
送出感谢: 0
接收感谢: 0

Re: [问题]求一个脚本,统计每个单词的出现频率,并排序[解决了]

#12

帖子 lu86391 » 2011-05-11 13:54

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
回复

回到 “Shell脚本”