分页: 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
本人初学脚本,这是写的第二个脚本,有不足希望大牛多多指教
