免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: yjbdsky
打印 上一主题 下一主题

[数值计算] 最高在线人数计算,求大牛帮忙 [复制链接]

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
11 [报告]
发表于 2015-03-13 11:35 |只看该作者
回复 10# yjbdsky


    是有问题,忽略了同一时间点进出人数不等的情况.我改一下...稍等.

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
12 [报告]
发表于 2015-03-13 11:49 |只看该作者
本帖最后由 我是一隻羊 于 2015-03-13 14:09 编辑
  1. awk 'function m(x,y){k=x>=j?y:k;j=x>=j?x:j;return j" "k}$NF ~ /guest/{a[$2]=$2;a[$4]=$4;b[$2]++;c[$4]++}END{for(i=0;i++<asort(a);){b[a[i]]?s+=b[a[i]]:1;c[a[i]]?s-=c[a[i]]:1;z=m(s,a[i])}print z}' inputfile
复制代码
  1. 59 18:19:20
复制代码
  1. awk '$NF~/guest/{gsub(/:/,"");if(($2<="181920")&&($4>"181920")) a++}END{print a}' inputfile
复制代码
  1. 59
复制代码
还是超了...是59,但是验证好像没问题....楼主你确定是55人上限么?

论坛徽章:
0
13 [报告]
发表于 2015-03-13 11:52 |只看该作者
回复 9# 我是一隻羊

下面我有传数据了,执行出的结果是138 18:23:34   但你再找出18:23:34在两个时间之前的记录,确只有59条

   

论坛徽章:
0
14 [报告]
发表于 2015-03-13 11:53 |只看该作者
回复 12# 我是一隻羊

59应该是没问题了,55有点错


   

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
15 [报告]
发表于 2015-03-13 14:40 |只看该作者
本帖最后由 我是一隻羊 于 2015-03-13 15:11 编辑

回复 14# yjbdsky


我仔细又想了一下,还是有bug
以你给的文本为例.
人数最多的时候为59,而且只有一个时间段.所以不太看的出来...
我在原来文本后添加
  1. 2015-03-11 17:46:00        2015-03-11 17:46:01        guest
  2. 2015-03-11 17:46:00        2015-03-11 17:46:01        guest
  3. 2015-03-11 17:46:00        2015-03-11 17:46:01        guest
  4. 2015-03-11 17:46:00        2015-03-11 17:46:01        guest
  5. 2015-03-11 17:46:00        2015-03-11 17:46:01        guest
  6. 2015-03-11 17:46:00        2015-03-11 17:46:01        guest
复制代码
之后,应该有2个时段的人数都为59,按你需求我觉得应该把这两个时间段都找出来...但是执行上面的awk只能显示最后一个人数为59的时段.
于是我又改了下.....
  1. awk 'function m(x){x>=j?j=x:1}$NF ~ /guest/{a[$2]=$2;a[$4]=$4;b[$2]++;c[$4]++}END{for(i=0;i++<asort(a);){b[a[i]]?s+=b[a[i]]:1;c[a[i]]?s-=c[a[i]]:1;d[i]=s;m(s)}for(n=0;n++<length(d);)printf d[n]==j?"[ "a[n]","a[n+1]" )  "j"\n":""}' inputfile
复制代码
  1. [ 17:46:00,17:46:01 )  59
  2. [ 18:19:20,18:19:26 )  59
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
16 [报告]
发表于 2015-03-13 19:21 |只看该作者
本帖最后由 Herowinter 于 2015-03-13 23:50 编辑

回复 1# yjbdsky
  1. awk '{s1=$1" "$2;gsub(/-|:/," ",s1);t1=mktime(s1);s2=$3" "$4;gsub(/-|:/," ",s2);t2=mktime(s2);for(i=t1;i<=t2;i++)a[i]++} END{for(i in a)if(a[i]>max){t=i;max=a[i]};print "maxt time = "strftime("%Y-%m-%d %H:%M:%S", t);print "max number = "max;}' i
  2. maxt time = 2015-03-11 18:14:46
  3. max number = 60
复制代码
边界值的处理需要商榷,比如,对于这条记录
2015-03-11 17:28:39        2015-03-11 18:27:21        guest

17:28:39  18:27:21 用户算在线吗?
我的代码都算在线的,自己根据实际情况改一下这里的等号
for(i=t1;i<=t2;i++)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP