x兄 : 单纯的用户登入数没什么感觉 , 看看能不能把每个月的新老用户数 分开取出来 , 我结合下 ?
我: 这个 有些麻烦 ,单纯从日志里 区分出 新老 用户数 ,我想办法吧 .
....... 脚本编写能区分新老用户的准备中 (脚本-1) ............
通过 脚本一 我就可以判断 用户最早登入的时间(月),然后判断 这个用户在当前时间是否是新用户
....... 脚本编写能区分新老用户的准备中 (脚本-2) ............
当然 不是用 bdb 也可以 ( 脚本-3 )
x兄 : 感觉 新老用户 的操作 ,应该不太一样 ,抽样 下 新老用户 的具体操作
我 : ok
(脚本 - 1)
find login/ test_login/ -type f -exec cat {} \; |perl -nle ‘
BEGIN{
# 使用 bdb
use BerkeleyDB;
my $filename = "/tmp/new_old_adid.db";
my $env = new BerkeleyDB::Env
-Flags => DB_CREATE| DB_INIT_MPOOL
|| die "Cannot open environment: $BerkeleyDB::Error\n";
my $db = tie (%h, "BerkeleyDB::Btree",
-Filename => $filename,
-Flags => DB_CREATE,
-Env => $env)
|| die " Cannot open file $filename:$! $BerkeleyDB::Error\n";
}
if( /at=(\d{4}-\d{2}).*adid=(.*?)</ ){
# bdb 内只存储 用户最早登入的 用户 时间 - 月
# 以确保 这个用户能标识出 是新用户
$h{ $2 }=$1 if $1 lt $h{ $2 } ;
}
’
|
脚本 - 2
find login/ test_login/ -type f -name "*2010-08*" -exec cat {} \; |grep "wv=1.2" |perl -nle ‘
BEGIN{
# 使用 bdb
use BerkeleyDB;
my $filename = "/tmp/new_old_adid.db";
my $env = new BerkeleyDB::Env
-Flags => DB_CREATE| DB_INIT_MPOOL
|| die "Cannot open environment: $BerkeleyDB::Error\n";
my $db = tie (%h, "BerkeleyDB::Btree",
-Filename => $filename,
-Flags => DB_CREATE,
-Env => $env)
|| die " Cannot open file $filename:$! $BerkeleyDB::Error\n";
}
if(.*adid=(.*?)</ ){
$all{$1}++ ;
$new{$1}++ if $h{ $1 } eq $1 ;
}
END{
print scalar keys %new,"\t",scalar keys %all ;
}
’
|
脚本 -3
find login/ test_login/ -type f -exec cat {} \; |perl -nle ‘
if( /at=(\d{4}-\d{2}-\d{2}).*adid=(.*?)<.*/ ){
my $adid = $3;
my $at = $1 ;
$h{ $adid } = $at if not $h{$adid} ;
$h{ $adid } = $at if $h{$adid} gt $at;
}
END{
foreach my $adid (keys %h){
print "$adid\t$h{$adid}";
}
}
’ |sort -u > /tmp/adid_new_user.txt
|
# 再 分析时取出
/tmp/adid_new_user.txt 再装载到 map 里
BEGIN{
open FILE, "/tmp/adid_new_user.txt" or die $!;
%adid_newday = {} ;
while () {
chomp;
$adid_newday{$1} = $2 if /(.*?)\t(.*)/
}
}
阅读(613) | 评论(0) | 转发(0) |