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%\n",('$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

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

  1. js用img代替ajax js心跳 向服务器定时传送参数 主要计算用户在线时长

    html: <!doctype html><html><head><meta charset="utf-8"><title&g ...

  2. js计算在线时长

    后台传来毫秒,前台转换成对应的时分秒 //在线时长 function longTime(seconds){ //总秒数 //seconds=seconds/1000; //得到小时 var hour ...

  3. java web 程序---在线时长

    思路:toLocalString()这个方法 <body> <% long t=session.getLastAccessedTime(); long t2=session.getC ...

  4. 分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室

    实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSoc ...

  5. spa(单页应用)中,使用history模式时,微信长按识别二维码在ios下失效的问题

    spa(单页应用,vue)中,使用history模式时,微信长按识别二维码在ios下失效的问题. 触发条件: spa单页应用: 路由模式 history 从其他页面跳转到带有微信二维码识别的页面(不是 ...

  6. 用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)

    做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel ...

  7. 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符“A”的个数,并将结果显示在屏幕上。

    问题 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符"A"的个数,并将结果显示在屏幕上. 代码 data ...

  8. 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...

  9. seo标题关键字描述字数限制Title,keywords,description长度最长多长 ?

    seo标题关键字描述字数限制 seo优化各个搜索引擎收录Title,keywords,description长度最长多长 ?SEO网站优化中Title标签的作用为重中之重,好的Title也就成功了一半 ...

随机推荐

  1. CI框架自带的验证工具及汉化

    本人自己还是很喜欢CI框架自带的验证工具的,使用方式如下: /** *@blog<http://www.phpddt.com> */ public function do_login() ...

  2. MyBatis学习总结(一)

    MyBatis,是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解 ...

  3. HTTP1.1中CHUNKED编码解析(转载)

    HTTP1.1中CHUNKED编码解析 一般HTTP通信时,会使用Content-Length头信息性来通知用户代理(通常意义上是浏览器)服务器发送的文档内容长度,该头信息定义于HTTP1.0协议RF ...

  4. 介绍我最近做的网站 Asp.Net MVC4 + BootStrap

    一.前言 最近一直在做一个多站SEO数据分析的站点(www.easyyh.com),用了一些新技术,如Asp.Net MVC4,BootStrap,EasyUI,这些都是以前没有搞过的,最近搞得差不多 ...

  5. 【转】Maven项目中将配置文件打包到jar包中

    参考博客:http://blog.csdn.net/ciedecem/article/details/10382275 问题: 项目中需要用到从文件中加载json数据,如图放在conf目录下. 程序中 ...

  6. swift学习笔记3-4

    再牛逼的梦想,也抵不住你傻逼似的坚持! 我跑啊跑啊,为的就是赶上那个被寄予厚望的自己. 三.运算符+表达式 swift允许重载运算符,比如 “+”你可以重载它 后续会详细介绍 赋值运算符 pass 算 ...

  7. Linux下软件安装的四种方式

    一.源码安装 步骤: 下载,解压源码(常见的源码打包格式:.tar.gz/.tar.bz2); 可以直接下载源码再上传至linux服务器,或者在联网状态下,直接通过wget等命令获取源码安装包;源码解 ...

  8. elasticsearch 2.4 windows版jvm内存设置

    本文编写目的是因为网上有很多es修改内存配置的文章,方法也各有不同,但在我的情况下(es 2.4 windows版)发现很多方法都是无效的,有效只有以下方法 第一个是xms,第二个是xmx

  9. Android 模仿苹果虚拟悬浮按钮(自动靠边、可浮现任何界面上)

    由于最近小蔡的手机音量键坏了,调节音量有点麻烦,突发奇想,想自己实现一个快捷键来调节音量.在忘上参考了一些代码,总结出一般本章,分享给大家. 首先 按钮要想实现悬浮在任何界面,那么必须是要写在服务里面 ...

  10. 51nod 1525 重组公司

    题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有n个人在公司里面工作.员工从1到n编号.每一个人属于一个部门.刚开始每一个人在自 ...