分页: 1 / 1

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

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

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

发表于 : 2008-03-10 10:01
eexpress
词?
sort?

发表于 : 2008-03-10 10:23
yaoms
哈哈,有办法了,来自yingfei的
awk '{arr[$1]+=1 }END{for(i in arr){print arr"\t"i}}' FILE_NAME | sort -rn

发表于 : 2008-03-10 12:40
wenshu
再给一个简单点的方法:
sort -rn FILENAME |uniq -c |sort -rn

发表于 : 2008-03-10 12:42
yaoms
wenshu 写了:再给一个简单点的方法:
sort -rn FILENAME |uniq -c |sort -rn
谢谢,真是太好了,越来越简洁

发表于 : 2008-03-12 10:21
eexpress
以为没用的事情。今天居然,分析数据,我也要用到了。

发表于 : 2008-03-12 10:24
yaoms
呵呵。怎么会没用。。。

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

发表于 : 2011-05-08 13:03
lu86391
如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!

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

发表于 : 2011-05-08 13:17
lilydjwg
lu86391 写了:如果这个文件有上亿级别的数据,找出前100个最多的,用脚本该怎样做呢?
跪求!!!
计数排序。

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

发表于 : 2011-05-08 14:37
HelloAndroid
mark!

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

发表于 : 2011-05-08 20:05
scutdk
这个东西挺经典的呢

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

发表于 : 2011-05-11 13:54
lu86391
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