rendered paste body#!/app/gmd/bin/perl
use strict;
use Data::Dumper;
use Getopt::Std;
use POSIX qw(log10);
my %opts;
getopts('htdusr:', \%opts );
if ( $opts{h} ) {
usage();
exit;
}
# There's some reason I didn't use the time as a key ... I don't remember why :-/ this data structure sucks to work with
# Format of the data structure is :
# Per sample
# 0 : Time
# 1 : time ranking
# 2 : time converted to seconds since the beginning of the day
# 3 : updates / s for specific time sample
# 4 : delta ( change from the previous sample to the current )
# 5 : delta ranking
# 6 : slope
# 7 : slope ranking
my @file = <>;
my ($time,$seconds, $score,$trank);
my @pairs = map {
( $time , $score) = split;
$time =~ /(\d\d)\:(\d\d):(\d\d)/;
$seconds = ( $1*3600 + $2*60 + $3 );
[ $time,$trank++, $seconds, $score ]; # last column is for score ranking
} @file;
# populate the delta fields and the slope fields
for ( my $i; $i <= $#pairs; $i++ ) {
$pairs[$i][5] = ($i != 0) ? $pairs[$i][3] - $pairs[$i-1][3] : 0;
# print $pairs[$i][0],"\t",$pairs[$i][3],"\t",$pairs[$i][4],"\n"; #= $pairs[$i][2] - $pairs[$i-1][2]\n";
# print "$pairs[$i][7] = ($i != 0) ? ( $pairs[$i][5] / ($pairs[$i][2] - $pairs[$i-1][2]) ): 0\n**\n";
if ( $pairs[$i][2] eq $pairs[$i-1][2] ) {
print "Double timestamped for : $pairs[$i-1][0] and $pairs[$i][0] , assuming 5 second interval !\n";
$pairs[$i][7] = ($i != 0) ? ( $pairs[$i][5] / (5) ): 0;
}
else {
$pairs[$i][7] = ($i != 0) ? ( $pairs[$i][5] / ($pairs[$i][2] - $pairs[$i-1][2]) ): 0;
}
}
my $set = \@pairs;
# print "set before : ",join (",",@{$set}),"\n";
if ( $opts{r} ) {
if ( $opts{r} =~ /^(?:(09|1[0123456]))\:([012345]\d)to(?:(09|1[0123456])\:([012345]\d))/ ) {
# print "Start hour : $1\n";
# print "Start minute : $2\n";
# print "End Hour : $3\n";
# print "End minute : $4\n";
print "begin_time : $1*60*60+$2*60 : ",$1*60*60+$2*60," end time: $3*60*60+$4*60 : ",$3*60*60+$4*60,"\n";
$set = trim_time($1*60*60+$2*60 , $3*60*60+$4*60, $set );
# print "set : ",join (",",@{$set}),"\n";
# print Dumper($set);
# exit;
}
else {
print "Option R must be formatted : '-r 09:50to10:00'\n";
exit;
}
}
# print "set after : ",join (",",@{$set}),"\n";
rank_updaterate($set);
rank_delta($set);
rank_slope($set);
if ( $opts{t} ) {
printme( "*** Time Sorted***",sort mangle_time @{$set});
}
if ( $opts{d} ) {
printme( "*** Deriv. Sorted***",sort mangle_deriv @{$set});
}
if ( $opts{u} ) {
printme( "*** Update rate Sorted ***",sort mangle_updaterate @{$set}) ;
}
if ( $opts{s} ) {
printme ( "*** Slope Sorted ***",sort mangle_slope @{$set});
}
#print $$set[0][0],"\n";
#print $$set[0][1],"\n";
#print $$set[0][2],"\n";
#print $$set[0][3],"\n";
#print $$set[0][4],"\n";
#print "sleeping 20\n";
#$set = trim_time( 8*60*60, 17*60*60, $set);
#print $$set[0][0],"\n";
#print $$set[0][1],"\n";
#print $$set[0][2],"\n";
#print $$set[0][3],"\n";
#print $$set[0][4],"\n";
#printme ( "** Trimmed **", sort mangle_updaterate @{trim_time( 9*60*60+55*60, 10*60*60, $set)} );
printme ( "** Trimmed **", sort mangle_updaterate @{$set} );
print "Done\n";
sub rank_updaterate {
my $data = shift;
# figure out the rank for the update rate
my $rank = 1;
my $last = 0;
foreach my $element ( sort mangle_updaterate @{$data} ) {
if ( @{$element}[3] < $last ) {
$rank++;
}
# notice that [1] is used as our placeholder, it's the only unique item we have in the array between the 2 !
$$data[ @{$element}[1] ][4] = $rank; # stuff the ranking into the original array
$last = @{$element}[3];
}
}
sub rank_delta {
my $data = shift;
# find the rank for the deltas
my $rank = 1;
my $last = 0;
foreach my $element ( sort mangle_deriv @{$data} ) {
if (abs @{$element}[5] < abs $last ) {
$rank++;
}
$$data[ @{$element}[1] ][6] = $rank;
$last = @{$element}[5];
}
}
sub rank_slope {
my $data = shift;
# find the rank for the slope
my $rank = 1;
my $last = 0;
foreach my $element ( sort mangle_slope @{$data} ) {
if ( @{$element}[7] < $last ) {
$rank++;
}
$$data[ @{$element}[1] ][8] = $rank;
$last = @{$element}[7];
}
}
sub trim_time { # expects 2 times in seconds and the data, returns a new array of the proper length
my $start_time = shift;
my $end_time = shift;
my $array = shift;
my $results;
# trim the array to the time specifics we need
foreach my $element ( @{$array} ) {
# print "@{$element}[2] > $start_time && @{$element}[2] < $end_time \n";
if ( @{$element}[2] > $start_time && @{$element}[2] < $end_time ) {
# print join ( ",", @{$element} ),"\n";
push ( @{$results} , $element );
}
}
$array = $results;
return $array;
}
sub printme {
my $header = shift;
my @array = @_;
print $header."\n";
printf "%9s %7s (%6s) %7s (%5s) %6s (%5s)\n", "Time","upd./s","rank","delta","rank","slope","rank";
map {
printf "%9s %7s (%6s) %7s (%5s) %6.1f (%5s)\n",$_->[0],$_->[3],$_->[4],$_->[5],$_->[6],$_->[7],$_->[8];
} @array;
}
sub mangle_deriv { # sort by the absolute value of the difference in update rate between the last sample
abs( $b->[5] ) <=> abs ( $a->[5] );
# $b->[5] <=> $a->[5];
}
sub mangle_time {
$a->[2] <=> $b->[2];
}
sub mangle_updaterate {
$b->[3] <=> $a->[3];
}
sub mangle_slope {
$b->[7] <=> $a->[7];
}
sub usage {
print <<HERE
usage: $0 [-t] [-u] [-d] [datafile]
-d : delta -- compare the current update rate to the previous sample update rate and sort by the absolute value of the difference and print
-h : this help screen
-s : slope -- sort by the slope of the line between the previous and current samples
-t : time -- sort by the time within the file and print
-u : sort by the update rate and print
examples :
$0 -t 20070328.log
$0 -t -u 20070328.log
$0 -u 20070328.log
$0 -d 20070328.log
$0 -t -d 20070328.log
HERE
}