2010七月15
awk 实例之二维数组
由于 AWK 不支持二维数组,有时候使用起来还真不是那么得心应手。
这不,本次应用又遇到了难题,要是按照PHP的想法,仍然是用二维数组搞定,两层foreach一循环啥都完事了。可是不行啊,一个文件几十万行,用PHP去分析那不死的要多惨有多惨?
先来看一下日志结构,和原来一样,每行一条记录,用{SPR}分隔字段,第二个字段为游戏名,第四个字段为用户ID,现在要统计每个游戏的用户ID,且要消重,于是,困难来了。
Jul 13 23:59:58 [info] {SPR}poker{SPR}20100713235958{SPR}39487249{SPR}S1{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}40321910{SPR}S5{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}45937395{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46047210{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46100689{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}mcsd{SPR}20100713235958{SPR}46144879{SPR}S22{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46193512{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46249154{SPR}S9{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46311452{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46361704{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46401796{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46412612{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dfh{SPR}20100713235958{SPR}46414008{SPR}7{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}6428766{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}mcsd{SPR}20100713235959{SPR}26810901{SPR}S1{SPR}
Jul 13 23:59:59 [info] {SPR}wulin{SPR}20100713235959{SPR}28006063{SPR}hero10.wan.360.cn{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}29498036{SPR}S2{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}30401399{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}plsm{SPR}20100713235959{SPR}33290378{SPR}S3{SPR}
Jul 13 23:59:59 [info] {SPR}wulin{SPR}20100713235959{SPR}35130674{SPR}hero14.wan.360.cn{SPR}
Jul 13 23:59:59 [info] {SPR}mcsd{SPR}20100713235959{SPR}35990716{SPR}S22{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}39135264{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}39263733{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}45902989{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46051567{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46237264{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46241464{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46320919{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46337146{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46411556{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}40321910{SPR}S5{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}45937395{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46047210{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46100689{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}mcsd{SPR}20100713235958{SPR}46144879{SPR}S22{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46193512{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46249154{SPR}S9{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46311452{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46361704{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46401796{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}46412612{SPR}S10{SPR}
Jul 13 23:59:58 [info] {SPR}dfh{SPR}20100713235958{SPR}46414008{SPR}7{SPR}
Jul 13 23:59:58 [info] {SPR}dandan{SPR}20100713235958{SPR}6428766{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}mcsd{SPR}20100713235959{SPR}26810901{SPR}S1{SPR}
Jul 13 23:59:59 [info] {SPR}wulin{SPR}20100713235959{SPR}28006063{SPR}hero10.wan.360.cn{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}29498036{SPR}S2{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}30401399{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}plsm{SPR}20100713235959{SPR}33290378{SPR}S3{SPR}
Jul 13 23:59:59 [info] {SPR}wulin{SPR}20100713235959{SPR}35130674{SPR}hero14.wan.360.cn{SPR}
Jul 13 23:59:59 [info] {SPR}mcsd{SPR}20100713235959{SPR}35990716{SPR}S22{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}39135264{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}39263733{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}45902989{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46051567{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46237264{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46241464{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46320919{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46337146{SPR}S10{SPR}
Jul 13 23:59:59 [info] {SPR}dandan{SPR}20100713235959{SPR}46411556{SPR}S10{SPR}
绞尽脑汁,加上同事帮助,一共弄了两种实现方式,大家简单看一下
#将字段按{SPR}分隔
BEGIN{FS="{SPR}";OFS="\t"}
{
name=$2;
#用三止运算符,将gamearr数组里KEY为游戏名,结果为换行符加上用户ID
gamearr[name]=gamearr[name](gamearr[name]?"\n":"")$4;
}
END{
#循环每个游戏
for (name in gamearr)
{
#各个游戏对应的文件名
filename = name".log";
print gamearr[name] > filename;
}
}
BEGIN{FS="{SPR}";OFS="\t"}
{
name=$2;
#用三止运算符,将gamearr数组里KEY为游戏名,结果为换行符加上用户ID
gamearr[name]=gamearr[name](gamearr[name]?"\n":"")$4;
}
END{
#循环每个游戏
for (name in gamearr)
{
#各个游戏对应的文件名
filename = name".log";
print gamearr[name] > filename;
}
}
上面的是同事帮忙想的,下面是自己写的,见笑
#将字段按{SPR}分隔
BEGIN{FS="{SPR}";OFS="\t";}
{
#arrgame数组的KEY是游戏
arrgame[$2]++;
#gameqid数组的KEY是游戏,用户ID
gameqid[$2,$4]++;
}
END{
#循环每个游戏
for(name in arrgame)
{
filename = name".log";
for(qid in gameqid)
{
#将游戏名与用户ID分隔开,存放在qidarr数组中
split(qid,qidarr,SUBSEP);
if(name == qidarr[1]){
print qidarr[2] > filename;
}
}
}
}
BEGIN{FS="{SPR}";OFS="\t";}
{
#arrgame数组的KEY是游戏
arrgame[$2]++;
#gameqid数组的KEY是游戏,用户ID
gameqid[$2,$4]++;
}
END{
#循环每个游戏
for(name in arrgame)
{
filename = name".log";
for(qid in gameqid)
{
#将游戏名与用户ID分隔开,存放在qidarr数组中
split(qid,qidarr,SUBSEP);
if(name == qidarr[1]){
print qidarr[2] > filename;
}
}
}
}
解决问题的方法有很多,重要的是敢想,敢试。看来有时候人的大脑不运动的话,生起锈来比肌肉萎缩还吓人。
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2010/07/15/1814/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
虽然不懂是干什么的,但还是要支持啦~
[回复]
@阿邙
其实就是用AWK模仿二维数组的一个小例子,怕自己忘了,结合工作需要,将需求和实现写一下。呵。
[回复]
看不懂,但是支持啊!
[回复]
老兄也是玩代码的?
我也是,不过现在厌烦了代码,哎。
[回复]
老鸟啊,呵呵 学习学习!
[回复]
我也看不懂,难道就是筛选日志用的。 :grin:
[回复]
[回复]
还是觉得第一种方法好很多…
[回复]
一点儿没看懂丫。。
[回复]
@小明猪
但是事实证明,第二种效率高。
[回复]
@世纪之光
那老兄现在在做什么?呵呵。
[回复]
看不懂啊 哈哈
[回复]
支持了,我不懂这是干什么的。 :razz:
[回复]