使用awk的二维数组解决一个日志统计的实际问题


项目中遇到的一个实际问题,日志如下

2013-09-13 00:06:09:adid:10000254
2013-09-13 00:06:14:adid:10000254
2013-09-13 00:06:43:adid:10000253
2013-09-13 00:06:48:adid:10000254
2013-09-13 00:07:07:adid:10000254
2013-09-13 00:07:12:adid:10000254
2013-09-13 00:07:19:adid:10000254
2013-09-13 00:07:32:adid:10000254
2013-09-13 00:08:05:adid:10000254
2013-09-13 00:08:20:adid:10000240
2013-09-13 00:08:28:adid:10000253
2013-09-13 00:08:32:adid:10000253
2013-09-13 00:08:41:adid:10000254
2013-09-13 00:09:02:adid:10000253
2013-09-13 00:09:10:adid:10000254
2013-09-13 00:09:11:adid:10000240
2013-09-13 00:09:18:adid:10000254
2013-09-13 00:09:19:adid:10000254
2013-09-13 00:09:27:adid:10000254
2013-09-13 00:09:28:adid:10000240
2013-09-13 00:09:32:adid:10000253
2013-09-13 00:09:34:adid:10000240
2013-09-13 00:09:59:adid:10000253
2013-09-13 00:10:05:adid:10000254
2013-09-13 00:10:07:adid:10000253

    我想要按照小时去统计adid的个数awk的多维数组在本质上是一维数组,更确切一点,awk在存储上并不支持多维数组。awk提供了逻辑上模拟二维数组的访问方式。例如,array[2,4] = 1这样的访问是允许的。awk使用一个特殊的字符串SUBSEP (\034)作为分割字段,在上面的例子中,关联数组array存储的键值实际上是2\0344。

    类似一维数组的成员测试,多维数组可以使用 if ( (i,j) in array)这样的语法,但是下标必须放置在圆括号中。类似一维数组的循环访问,多维数组使用 for ( item in array )这样的语法遍历数组。与一维数组不同的是,多维数组必须使用split()函数来访问单独的下标分量。split ( item, subscr, SUBSEP)。
代码如下:

awk '
BEGIN{
ay[1,10]=5;
ay[10,2]=12;
}
END{
for (k in ay) {
   split(k,idx,SUBSEP);
   print idx[1],idx[2],ay[idx[1],idx[2]];
   }
}'
或者
awk '
BEGIN{
ay[1,10]=5;
ay[10,2]=12;
}
END{
for (k in ay) {
   print k,ay[k];
   }
}'

得到结果如下:

2013-09-13 00 10000239 76
2013-09-13 00 10000240 155
2013-09-13 00 10000253 89
2013-09-13 00 10000254 148
2013-09-13 01 10000180 121
2013-09-13 01 10000181 83
2013-09-13 01 10000239 42
2013-09-13 01 10000240 139
2013-09-13 01 10000253 56
2013-09-13 01 10000254 80
2013-09-13 02 10000180 46
2013-09-13 02 10000181 56
2013-09-13 02 10000239 16
2013-09-13 02 10000240 86
2013-09-13 02 10000253 26
2013-09-13 02 10000254 45

转载于:https://my.oschina.net/wojibuzhu/blog/162490

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值