• bash 统计在线时长最长的十个玩/统计一天内一直处于不活跃状态的玩家的百分比


    1、某游戏的客户端每隔5分钟会向服务端报告一次玩家的账户积分,如果两次报告的时间间隔不大于5分钟,认为该玩家在这5分钟内在线,假设报告数据的格式如下:

    IP                   Datetime                Score

    223.152.112.238      2014-08-22 12:01:35     54232

    现有一天的数据,按时间按序保存,粗略估计玩家数在百万左右,请使用尽量少的硬件资源完成以下请求,统计在线时长最长的十个玩家;如果玩家两次提交的积分相同,认为玩家在5min的在线时间内不活跃,请统计一天内一直处于不活跃状态的玩家的百分比。

    game_user_calculate.bash文件代码如下:

    #!/bin/bash
    
    #先统计有多少个用户,即有多少个ip
    sed '1d' log_all > log_all_1
    awk '{ip[$1]++}END{for(i in ip){print i, ip[i]}}' log_all_1 > user
    awk '{ip[$1]++}END{for(i in ip){print i}}' log_all_1 > user
    user_count=`cat user | wc -l`
    
    
    #把每个用户的记录提取出来
    for((i=1;i<=$user_count;i++));
    do
    	#逐一取出各个ip
    	one_user=`sed -n "$i"p user`
    	
    	#根据ip筛选出属于此ip的报告记录,并统计报告次数
    	list_count=`grep "$one_user" log_all_1 | wc -l`
    	
    	#根据ip筛选出属于此ip的报告记录,并从第四列分数中统计出不同分数的个数
    	score_count=`grep "$one_user" log_all_1 | awk '{print $4}' | sort -u | wc -l`
    	
    	#将每个用户的报告总次数写入行首
    	sed -i "$i{s/^/ $list_count /}" user
    	
    	#将每个用户的不同分数的个数,写入行尾
    	sed -i "$i{s/$/ $score_count /}" user 
    done
    
    
    #把有记录报告次数和用户IP的文件及不同分数的文件user, 按记录次数由大到小排序,且取ip字段,并输出前十个
    echo "The first 10 users online are"
    sort -n -r -k 1 user | awk '{print $2}' | sed -n '1,10p' | cat -n
    
    #-n是以数值来排序
    #-r是降序排列,默认是升序
    #-k指定列数
    
    
    #统计一天内一直处于不活跃状态的玩家总数,
    nowake=`awk '{print $3}' user | grep "1" | wc -l`
    
    #计算不活跃状态玩家的百分比
    echo Percentage of no active users is: `awk 'BEGIN{printf "%.2f%
    ",('$nowake'/'$user_count')*100}'`
    

     log文件如下:

    IP                   Datetime                Score
    223.152.112.238      2014-08-22 12:01:35     54232
    223.152.112.238      2014-08-22 12:06:35     54232
    223.152.112.238      2014-08-22 12:11:35     54232
    223.152.112.238      2014-08-22 12:17:35     54232
    223.152.112.236      2014-08-22 12:01:35     54232
    223.152.112.236      2014-08-22 12:06:35     54231
    223.152.112.236      2014-08-22 12:15:35     54232
    223.152.112.237      2014-08-22 12:01:35     54232
    223.152.112.237      2014-08-22 12:06:35     54232
    223.152.112.237      2014-08-22 12:11:35     5420
    223.152.112.237      2014-08-22 12:16:35     54232
    223.152.112.237      2014-08-22 12:29:35     54232
    223.152.112.237      2014-08-22 12:34:35     54232

  • 相关阅读:
    mybatis-plus 中的LocalDateTime, LocalDate, LocalTime
    mybatis plus 中的Serializable
    JavaSE: FileWriter类 & FileReader类
    JavaSE: IO流的概念
    JavaSE: File类
    JavaSE: 自定义异常
    JavaSE: 异常的抛出
    Vocabulary: hoarse
    JavaSE: finally的使用
    Vocabulary: appalling
  • 原文地址:https://www.cnblogs.com/yajing-zh/p/4910728.html
Copyright © 2020-2023  润新知