- 论坛徽章:
- 0
|
目标是计算日志文件中每个服务器每天的基尼系数。
数据格式:
日志文件是一天一个.log文件,其中包含所有服务器的。
IP|时间|服务器区号|QQ号|流水号|角色GUID|op_type|装备GUID|装备ID|当前强化(精炼)后等级
现在写了几个小程序:
1.筛选op_type=15|16; #15和16代表需要的强化(精炼)等级
2.按照服务器号排序; #可以省略
3.按服务器号抽取角色GUID|强化(精炼)等级; #以这个等级作为财富值
4.统计每个角色GUID的强化(精炼)等级和;
5.基尼系数计算。
现在困难是不知道怎么链接程序和一次性完成所有日志文件的处理。
希望好心人帮忙看看,身边都不学Perl。。。
五段小程序:
①- #!/usr/bin/perl -w
- use 5.014;
- open(F,"equ.txt")or die "error:$!";
- while(<F>){
- chomp;
- my @array=split /\|/;
- if($array[6]==15 or $array[6]==16){
- print "$array[2]|$array[5]|$array[9]\n"; #输出服务器区号、角色GUID、当前强化(精炼)等级
- }else{next;}
-
- }
- close F;
复制代码 ②- #!/usr/bin/perl -w
- use 5.014;
- open(F,"equ1.out")or die "error:$!";
- my @line;
- my @out;
- my $out;
- while(<F>){
- chomp;
- push @line, [ split /\|/];
- }
- @out = sort { $a->[0] <=> $b->[0] or $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] }@line;
- for $out (@out)
- {
- print "@$out\n";
- }
-
- close F;
复制代码 ③- #!/usr/bin/perl
- open(F,"equ2.out")or die "error:$!";
- while(<F>){
- chomp;
- @array=split; #切成数组
- if($array[0]==0){
-
- print "$array[1]|$array[2]\n";
- }
- }
- close F;
复制代码 ④- #!/usr/bin/perl -w
- open(F,"equ30.out")or die "error:$!";
- while(<F>){
- chomp;
- @array=split /\|/;
- $freq{$array[0]}++;
- $amount{$array[0]}+=$array[1];
- }
- close F;
- foreach $temp (sort {$amount{$b}<=>$amount{$a}} keys %freq) {
- print $amount{$temp}.",";
- }#按照强化和精炼等级和排序,输出强化、精炼等级和。
复制代码 ⑤- #!/usr/bin/perl
- open(F,"equ4.out")or die "error:$!";
- while(<F>){
- chomp;
- my @origx=split /\,/;
- my $gini=calc_gini(@origx);
- print "$gini\n";
- exit;
- sub calc_gini{
- my @origx=@_;
- my @x = sort { $a <=> $b } @origx;
- my $ginisum=0;
- my $sum=0;
- my $count=@x;
- for (my $i=1;$i<=$count;$i++) {
- $ginisum=$ginisum+(2*$i-$count-1)*$x[$i-1];
- $sum=$sum+$x[$i-1];
- }
- my $gini=$ginisum/($count-1)/$sum;
- return $gini;
- }
- }
- close F;
复制代码 新手刚学,程序写的简陋啰嗦了点。 |
|