免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2000 | 回复: 6
打印 上一主题 下一主题

请教一个棘手的统计,awk相关 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-10 16:09 |只看该作者 |倒序浏览
data文件格式如下:

1   jack   1200406087123
2   tom   1210206087123
3   jack   1210406087000
4   jack   1210406087123

field分别表示:id,人名,操作时间(这个是毫秒数,从1970-01-01开始的)

现在要取出最近一个月内的分布数据,
即:一个月内每天的记录数量和不同的人。

我刚开始学shell,
有几个问题不太会,请教高手

我已经能做到的:
(1)统计一定时间内的记录数
awk 'BEGIN{total=0}{if($3>120343400403) total+=1} END{print total}' data
(2)统计一定时间内不同的用户数量
awk 'BEGIN{uc=0} {if($3>120343400403) arr[$2]+=1} END{{ for(i in arr) uc+=1} {print uc} }' data
将上述两个功能弄到一起我也会了

需要求助各位的:
如何取得最近一个月的自然日的分布数据,格式如下
日期  用户数 记录数
0401 2        5
0402 3        4
0403 0        0

按我现在的做法,我只会按天,循环执行上面的语句,得到每天的数据,然后再整合统计。
但是我的数据比较大,有1000万条左右,如果统计两三个月的就要循环几十次,太慢了,

请问高手有什么方法吗

论坛徽章:
0
2 [报告]
发表于 2008-05-10 17:44 |只看该作者
分割成天数据,在按天统计比较好一些
个人想不出什么好办法,下面的命令把某天数据提取出来。
awk '$3>=xxxxxxxxxxxx, $3<=yyyyyyyyyyyy' data

再结合你原有命令,似乎也不会太慢.

论坛徽章:
0
3 [报告]
发表于 2008-05-10 18:35 |只看该作者

回复 #2 小鹭 的帖子

我正在尝试另一个途径,
用strftime来取日期
正在尝试

论坛徽章:
0
4 [报告]
发表于 2008-05-10 19:36 |只看该作者
bash-3.2$ echo "1   jack   1200406087123
2   tom   1210206087123
3   jack   1210406087000
4   jack   1210406087123

"|gawk 'BEGIN{
#取当月月初对应的毫秒数,存在mm01中
mm01=(mktime(strftime("%Y %m 01 00 00 00"))*1000);
}
{
  #print "调试1",$0,strftime("%m%d",$3/1000);
}
#时间在mm01以后(即本月的):
$3>=mm01{
#取当前行的日期值mmdd
mmdd=strftime("%m%d",$3/1000);
# print "调试2",$0,mmdd;
#每天的记录数加一,如果该日期首次出现,则按出现序号记下日期,便于按顺序打印
if(!dayrecord[mmdd]++) daynum[++days]=mmdd;
#每天每人的记录数加一,如果该人是今天第1次出现则该天的人数加1
if(!daymanrecord[mmdd,$2]++)dayman[mmdd]++;
}
END{
#打印每天的人数及记录数,原来没按顺序打印。现在按出现的先后顺序打印;
   for (day=1;day<=days;day++){
      if (dayrecord[mmdd=daynum[day]])print mmdd,dayman[mmdd],dayrecord[mmdd];
   }
}'
0508 1 1
0510 1 2

[ 本帖最后由 zhangshebao 于 2008-5-10 22:05 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-05-10 21:09 |只看该作者
原帖由 zhangshebao 于 2008-5-10 19:36 发表
bash-3.2$ echo "1   jack   1200406087123
2   tom   1210206087123
3   jack   1210406087000
4   jack   1210406087123

"|gawk 'BEGIN{
mm01=(mktime(strftime("%Y %m 01 00 00 00"))*1000);
}
{
...



能详细注释一下就好了!

论坛徽章:
0
6 [报告]
发表于 2008-05-10 22:09 |只看该作者
4楼加了注解了,增加了按顺序打印。

论坛徽章:
0
7 [报告]
发表于 2008-05-10 23:44 |只看该作者
太感动了。。。。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP