awk 实例之二维数组
浏览:5001次 出处信息
这不,本次应用又遇到了难题,要是按照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} |
绞尽脑汁,加上同事帮助,一共弄了两种实现方式,大家简单看一下
以下是引用片段: #将字段按{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; } } |
上面的是同事帮忙想的,下面是自己写的,见笑
以下是代码片段: #将字段按{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; } } } } |
解决问题的方法有很多,重要的是敢想,敢试。看来有时候人的大脑不运动的话,生起锈来比肌肉萎缩还吓人。
建议继续学习:
- Linux命令行里的“瑞士军刀” (阅读:10272)
- AWK 简明教程 (阅读:8185)
- awk命令,实现文件的合并与拆分 (阅读:6634)
- AWK介绍 (阅读:5512)
- 更快的IP库查找方法以及AWK中的二分查找 (阅读:5315)
- SED命令行脚本快速参考,AWK命令行脚本快速参考,perl命令行脚本快速参考 (阅读:3825)
- 操作大文本,awk vs vim (阅读:3772)
- 从shell中向awk传递变量实例 (阅读:3617)
- bash shell - sed及awk文本捕获及替换 (阅读:3517)
- bash shell - sed, awk文本捕获及替换 (阅读:3494)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Library cache内部机制详解
后一篇:值得深醒的两则Shell >>
文章信息
- 作者:simaopig 来源: 小小子,simaopig
- 标签: awk
- 发布时间:2010-07-15 08:40:44
建议继续学习
近3天十大热文
- [70] IOS安全–浅谈关于IOS加固的几种方法
- [69] Twitter/微博客的学习摘要
- [64] 如何拿下简短的域名
- [63] Go Reflect 性能
- [63] android 开发入门
- [61] find命令的一点注意事项
- [59] 流程管理与用户研究
- [58] Oracle MTS模式下 进程地址与会话信
- [58] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则