BASH腳本第六課

1、某遊戲的客戶端每隔5分鐘會向服務端報告一次玩家的賬戶積分,如果兩次報告的時間間隔不大於5分鐘,認爲該玩家在這5分鐘內在線,假設報告數據的格式如下:
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%


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章