免费注册 查看新帖 |

Chinaunix

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

[文本处理] 计算用户连续出现次数。 [复制链接]

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
11 [报告]
发表于 2014-05-29 17:11 |只看该作者
Gan Fa Yin Cang Tie, TJJTDS...
{:3_183:}FireFox版隐藏贴回复机自动回复

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
12 [报告]
发表于 2014-05-29 18:08 |只看该作者
本帖最后由 damcool 于 2014-05-29 19:30 编辑
  1. awk '/^[0-9]+$/{last=(curr=="")?$0:curr;curr=$0}/^[^0-9]+$/{if (tod[$0]!=last){if (freq[$0]>2) {printf"%s-%s:%s:%d\n",fromd[$0],tod[$0],$0,freq[$0]-1;sum[$0]+=freq[$0]-1}fromd[$0]=curr;freq[$0]=1}else freq[$0]++;tod[$0]=curr}END{for (i in freq)if (freq[i]>2) {printf"%s-%s:%s:%d\n",fromd[i],tod[i],i,freq[i]-1;sum[i]+=freq[i]-1}; print "########## summary ##############";for(i in sum) printf "%s:%d\n",i,sum[i]}' test
复制代码
test file
  1. 20140401
  2. caoyihong
  3. chengwei
  4. dengqinglin
  5. gongll
  6. wangying
  7. duxuedong
  8. huanglu.px
  9. huangshengming
  10. leizhenguo
  11. liaoweiping
  12. linping
  13. lishaoqing
  14. liujianyi
  15. liuqinghua
  16. 20140402
  17. jxmailtestvip
  18. caoyihong
  19. chengwei
  20. dengqinglin
  21. duxuedong
  22. huanglu.px
  23. lihh
  24. 20140403
  25. jxmailtestvip
  26. caoyihong
  27. chengwei
  28. duxuedong
  29. huanglu.px
  30. leizhenguo
  31. liaoweiping
  32. linping
  33. lishaoqing
  34. liujianyi
  35. lill
  36. 20140404
  37. chengwei
  38. dengqinglin
  39. duxuedong
  40. huanglu.px
  41. huangshengming
  42. leizhenguo
  43. liaoweiping
  44. linping
  45. lishaoqing
  46. zhaoqun
  47. liuqinghua
  48. 20140405
  49. zhaoqun
  50. 20140406
  51. gongll
  52. 20140407
  53. gongll
  54. 20140408
  55. gongll
  56. 20140409
  57. dengqinglin
  58. chengwei
  59. duxuedong
  60. huanglu.px
  61. liuqinghua
  62. gongll
  63. huangshengming
  64. liaoweiping
  65. linping
  66. caoyihong
  67. lishaoqing
  68. liujianyi
  69. 20140410
  70. lishaoqing
  71. dengqinglin
  72. liaoweiping
  73. wangying
  74. duxuedong
  75. huanglu.px
  76. chengwei
  77. huangshengming
  78. leizhenguo
  79. linping
  80. liujianyi
  81. liuqinghua
复制代码
result
  1. 20140401-20140404:chengwei:3
  2. 20140401-20140404:duxuedong:3
  3. 20140401-20140404:huanglu.px:3
  4. 20140401-20140403:caoyihong:2
  5. 20140406-20140409:gongll:3
  6. ########## summary ##############
  7. huanglu.px:3
  8. caoyihong:2
  9. duxuedong:3
  10. gongll:3
  11. chengwei:3
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
13 [报告]
发表于 2014-05-29 18:19 |只看该作者
本帖最后由 damcool 于 2014-05-29 19:16 编辑

瘦身版
  1. awk '/^[0-9]+$/{l=(c=="")?$0:c;c=$0}/^[^0-9]+$/{if (t[$0]!=l){if (q[$0]>2) {printf"%s-%s:%s:%d\n",f[$0],t[$0],$0,q[$0]-1;s[$0]+=q[$0]-1}f[$0]=c;q[$0]=1}else q[$0]++;t[$0]=c}END{for (i in q)if (q[i]>2) {printf"%s-%s:%s:%d\n",f[i],t[i],i,q[i]-1;s[i]+=q[i]-1}; print "########## summary ##############";for(i in s) printf "%s:%d\n",i,s[i]}' test
复制代码

论坛徽章:
771
金牛座
日期: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
14 [报告]
发表于 2014-05-29 18:56 |只看该作者
本帖最后由 Herowinter 于 2014-05-29 19:09 编辑

回复 1# expert1
做个时间简化版的吧,请多多指教。
  1. awk '/^[0-9]+$/{date=$0;day[++n]=$0;next} {name[$0];sign[$0,date]} END{for(i in name){s=t=0;for(j=1;j<=n;j++){if((i,day[j]) in sign){if(s==0)s=t=day[j];else t=day[j];if(j!=n)continue};if(t-s>=2){sum[i]+=t-s;print s"-"t" "i" "t-s};if(s!=0)s=t=0}};print "#####summary#####";for(i in sum)print i,sum[i]}' i
  2. 55-57 bob 2
  3. 51-54 cj 3
  4. 56-58 cj 2
  5. 51-53 tom 2
  6. 57-60 tom 3
  7. #####summary#####
  8. bob 2
  9. cj 5
  10. tom 5
复制代码
如果原始数据日期绝对连续的话,不需要mktime处理也可以得到结果。
  1. 20140401-20140404 huanglu.px 3
  2. 20140401-20140403 caoyihong 2
  3. 20140401-20140404 duxuedong 3
  4. 20140406-20140409 gongll 3
  5. 20140401-20140404 chengwei 3
  6. #####summary#####
  7. huanglu.px 3
  8. caoyihong 2
  9. chengwei 3
  10. gongll 3
  11. duxuedong 3
复制代码

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
15 [报告]
发表于 2014-05-29 19:03 |只看该作者
考虑的不错,但是往深里想其实没有道理的。
我们知道连续日期可能正确,有没有想过周末节假日?周末好处理,节假日那?还有老师请假呐?是不是要建数据库了?呵呵,典型的solution provider的思路。其实只要保证给定的数据源正确就可以了。做到这一点很容易的。不是吗?
seesea2517 发表于 2014-05-29 16:57
{quote}
数字代表日期,上面说了,真正日期可以用函数加工为UNIX时间,简明起见,就用连续数字代替。
{q ...

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
16 [报告]
发表于 2014-05-29 19:52 |只看该作者
其实原帖不是点名考勤的,我为了容易理解转成这个例子罢了。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
17 [报告]
发表于 2014-05-29 20:15 |只看该作者
回复 9# seesea2517


    这个好解决,把日期放数组里面,然后记住日期开始,结束,最后

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

if (! i in array[date]) continue  #不存在,继续下一天

///日期存在,做相应处理。

不过这么改的话,规则也要变了。

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
18 [报告]
发表于 2014-05-29 20:26 |只看该作者
呵呵,20140228+1!=20140301
expert1 发表于 2014-05-29 20:15
回复 9# seesea2517

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
19 [报告]
发表于 2014-05-29 20:31 |只看该作者

应该是mktime吧,转成Unix时间啊,然后for的时候

i++写成

i+86400

就好了。一回事,时候再转回来。懒得折腾了。

回复 18# damcool


   

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
20 [报告]
发表于 2014-05-29 20:54 |只看该作者
回到我说的问题上了,周六周日呐?节假日呐?
expert1 发表于 2014-05-29 20:31
应该是mktime吧,转成Unix时间啊,然后for的时候

i++写成
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP