IP Datetime Score
223.152.112.238 2014-08-22 12:01:35 54232
現有一天的數據,按時間按序保存,粗略估計玩家數在百萬左右,請使用盡量少的硬件資源完成以下請求,統計在線時長最長的十個玩家;如果玩家兩次提交的積分相同,認爲玩家在5min的在線時間內不活躍,請統計一天內一直處於不活躍狀態的玩家的百分比。
#!/bin/bash
exec 2>> /dev/null
DATA_FILE=/root/tkp/score.dat
TEMP_FILE=/root/tkp/temp.dat
TOTAL_LINES=`awk -F" " '/^[0-9]/{print $1}' /root/tkp/score.dat | sort -u | wc -l`
list=`awk -F" " '/^[0-9]/{print $1}' /root/tkp/score.dat | sort -u`
unlive_count=0
#Phase1 output the top 10 online users
echo TOP 10 online users
awk -F" " '/^[0-9]/{count[$1]++}END{for(ip in count){printf("%s %d minutes\n",ip,count[ip]*5);}}' /root/tkp/score.dat | sort -nrk 2 | head -10
echo "----------------------------------------------------------"
#Phase2 output the percent of users always offline
#this function can judge whether the user is always offline
function live()
{
ip=$1
start_score=`cat /root/tkp/score.dat | grep $ip | awk -F" " '{print $4}' | head -1`
start_count=`cat /root/tkp/score.dat | grep $ip | wc -l`
real_count=`cat /root/tkp/score.dat | grep $start_score | grep $ip | wc -l`
if [ $start_count -eq $real_count ];then
echo 1
else
echo 0
fi
}
for val in $list
do
IP=$val
#echo ip is $val
flag=$(live $IP)
if [ $flag -eq 1 ];then
unlive_count=$(($unlive_count+1))
fi
done
unlive_count=$(($unlive_count*100))
percent=$(($unlive_count/$TOTAL_LINES))
echo the percentage of unlive-user is $percent%