Chinaunix
标题:
经典pv统计问题的脚本求教,也许早有了,请教!
[打印本页]
作者:
opiopuiopoi
时间:
2010-05-14 17:43
标题:
经典pv统计问题的脚本求教,也许早有了,请教!
原始日志格式文本如下:
#cat a.lst
10.10.1.1
http://www.hao.com/1.html
10.10.1.2
http://www.hao.com/2.html
10.10.1.3
http://www.hao.com/3.html
10.10.1.4
http://www.hao.com/4.html
10.10.1.2
http://www.hao.com/1.html
10.10.1.1
http://www.hao.com/1.html
10.10.1.1
http://www.hao.com/2.html
10.10.1.2
http://www.hao.com/3.html
10.10.1.1
http://www.hao.com/1.html
10.10.1.3
http://www.hao.com/2.html
求教一shell脚本或perl脚本处理后生成如下报表:
url 独立ip pv
--------------------------------------------------------------------
http://www.hao.com/1.html
2 4
http://www.hao.com/2.html
3 3
http://www.hao.com/3.html
2 2
http://www.hao.com/4.html
1 1
总结:即通过url计算每个url的独立ip数和pv数,并可按pv数或者独立ip数量进行排序。
作者:
lkk2003rty
时间:
2010-05-14 18:04
awk '{if($2 in a){split(a[$2],c," "); c[2]++;if(!match(b[$2],$1)) {c[1]++;b[$2]=b[$2]" "$1;} a[$2]=c[1]" "c[2];} else {a[$2]="1 1";b[$2]=$1}} END{for(i in a)print i,a[i]}' file
复制代码
作者:
kwokcn
时间:
2010-05-14 18:24
awk '{a[$2]++;if(!b[$2"_"$1]){b[$2"_"$1]=1;n[$2]++}}END{for(i in a) print i,n[i],a[i]}' URFILE | sort -k3n
# 前面两行在前面直接输出就行了
# 排序用sort处理即可,按独立IP数是-k2n,按pv值是-k3n,如果倒序排就加个r
复制代码
作者:
Shell_HAT
时间:
2010-05-14 18:41
awk '!($0 in a){a[$0];a[$2]++}{b[$2]++}END{for(i in b)print i,a[i],b[i]}' urfile | sort
复制代码
作者:
yx07004212
时间:
2010-05-15 00:42
awk '{if(!a[$1,$2]++)b[$2]++;c[$2]++}END{for(i in b)print i,b[i],c[i]}' urfile |sort
复制代码
作者:
opiopuiopoi
时间:
2010-05-15 16:39
非常感谢楼上各位老大。{:3_200:}
作者:
iori809
时间:
2010-05-16 09:24
回复
4#
Shell_HAT
写的真好~同样一个需求,用最简洁的代码实现。这个思路我觉得应该是相对而言非常简洁了~佩服
作者:
howge
时间:
2010-05-16 18:15
回复
2#
lkk2003rty
翻译下:
awk '{if($2 in a){split(a[$2],c," "); c[2]++;if(!match(b[$2],$1)) {c[1]++;b[$2]=b[$2]" "$1;} a[$2]=c[1]" "c[2];} else {a[$2]="1 1";b[$2]=$1}} END{for(i in a)print i,a
}' file
1.先定义个数组a[$2]=“1 1”“1 1”分别代表独立ip个数 和pv值 b[$2]=$1
2.如果网址在数组a里面,将数a[$2]切分分成数组c c[2]++ 递增,如果这行的ip不重复,c[1]++递增 b[$2] 变成b[url]=url+ip然后a[$2]重新赋值
3.最后遍历
作者:
expert1
时间:
2010-05-17 10:18
留个记号看先学习了哦
作者:
expert1
时间:
2010-05-17 12:18
回复
4#
Shell_HAT
!($0 in a)
什么意思呢?
作者:
Shell_HAT
时间:
2010-05-17 12:56
回复
10#
expert1
当前行前面没有出现过,也就是说本行不是重复行。
作者:
howge
时间:
2010-05-17 13:33
回复
10#
expert1
主要用来去重~~ 就是$0不在数组里面
作者:
qinghan1125
时间:
2010-05-17 14:32
mark ※※ learning
作者:
kofit
时间:
2010-05-17 16:17
回复
3#
kwokcn
教头,b[$2"_"$1]=1; 这句的作用是什么?
作者:
kwokcn
时间:
2010-05-17 16:32
标签,记录URL和IP是否同时出现过。没用$0是考虑到暂时不清楚楼主的文本是否存在分隔符不同的情况,例如有空格有\t。
作者:
kofit
时间:
2010-05-17 16:46
回复
15#
kwokcn
谢谢~
作者:
laohuanggua
时间:
2010-05-17 22:31
回复 kwokcn
教头,b[$2"_"$1]=1; 这句的作用是什么?
kofit 发表于 2010-05-17 16:17
只有以前没有出现的域名ip组合才到n数组中设置增加,对于出现过的,都在b[$2"_"$1]=1;这一句中设置1了。
话说我也没想出来获取中间列的步骤,也是来学习下的~~~
ps:
貌似
b[$2_$1]就可以,不需要那个双引号。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2