Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1095581
  • 博文数量: 186
  • 博客积分: 4939
  • 博客等级: 上校
  • 技术积分: 2075
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 17:15
文章分类

全部博文(186)

文章存档

2018年(1)

2017年(3)

2016年(11)

2015年(42)

2014年(21)

2013年(9)

2012年(18)

2011年(46)

2010年(35)

分类: 系统运维

2014-05-30 14:53:57

原帖  , 众多解决办法,我的如下:

     大家都有上课签到点名的经历,比如在一个月内(日期连续,包含周末节假日)某人连续签到3天以上算有效的签到,并且计算为N-1次(N必须大于3),现在给出签到表,统计该人连续出清天数和一个时间段内总有效签到次数。

e.g 某人2014-6-1到2014-6-5连续出现,那么算有效(符合连续并且大于3天的条件),则应该打印

2014-6-1 2014-6-5 somebody 4

6号 somebody不来签到了,7,8号来一天,9号又不来了,虽然连续但少于3天但依然无效。 以此类推,假如10-14号又连续签到,应该打印

2014-6-10 2014-6-14 somebody 3
。。。 #省略若干
。。。。。。
最后统计somebody该时间段内签到次数,4+3=7

数据如下(由于跨年份/月份的可以用awk的时间函数处理,简单起见,就直接简单列出了数字来替代,否则直接gensub或者mktime/strf之类的加工一下没什么难度)

51
cj
bob
zooyo
tom
52
tom
cj
53
tom
zooyo
cj
54
zooyo
cj
55
bob
56
bob
cj
57
zooyo
bob
tom
cj
58
tom
cj
59
tom
60
tom
cj
数字代表日期,上面说了,真正日期可以用函数加工为UNIX时间,简明起见,就用连续数字代替。
根据上述要求,结果应该是
55-57 bob 2
51-54 cj 3
56-58 cj 2
51-53 tom 2
57-60 tom 3
########## summary ##############
bob 2
cj 5
tom 5




awk
'/[0-9]/{if(NR==1)start=$0;end=$0}/[a-zA-Z]/{a[end" "$0];b[$0]}END{


  1.        
  2.         for(j in b)

  3.         {

  4.            for(i=start;i<=end;i++)

  5.                 {


  6.                    if(i" "j in a){if(!d[j]++)k=i;c[j]++}


  7.                    else {


  8.                           if(c[j]>2){

  9.                                      print k"-"i-1,j,c[j]-1;m[j]+=c[j]-1;c[j]=0;d[j]=0

  10.                           } else


  11.                            c[j]=0;d[j]=0

  12.                      }



  13.                  }


  14.        }

  15. for(i in c)if(c[i]>2){print k"-"end,i,c[i]-1;m[j]+=c[j]-1}

  16. print "########## summary ##############"

  17. for(i in m)print i,m[i]

  18. }' user
思路,遍历日期范围和user,END部分循环user/date,假如出现了,自加,记录首次出现的日期,没出现赋值为0, 接下来如不继续出现,判断是否大于2,是,打印起始日期,并且自动清0,m[j]+=这个是最后做summary用的;小于2,赋值为0;数组d是为了实现记录该用户第一次出现的日期。
最后for (i in c)是最后一天还出现的情况,依然要判断;然后统计给出summary.

另外有个办法,格式转成user date,比如bob 50 51 ... 60,
然后split,比较数字是否连续并且>2,其他跟我的这个类似。
阅读(1991) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~