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