⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 merge-stats.pl

📁 基于chord算法的p2p文件系统。A p2p file system based on chord.
💻 PL
字号:
#!/usr/bin/perl -wuse strict;use Getopt::Long;my %options;&GetOptions( \%options, "args=s", "update=s");my $argsfile;if ($options{"args"}) {  $argsfile = $options{"args"};}my @logs;if ($options{"logs"}) {  open LOGS, $options{"logs"} or die "cannot open logs $options{\"logs\"}\n";  @logs = <LOGS>;  close LOGS;}else{  @logs = <STDIN>;}my %exist;my $oldheader;if ($options{"update"}) {   my $updatef = $options{"update"};   open FILE, $options{"update"} or die "cannot open file $options{\"update\"}\n";   $oldheader = <FILE>;   my $line;   while (<FILE>) {     chop;     $line = $_;     if (/^#/) 	{      s/^#\s+//;      $exist{$line} = <FILE>;     }else{       die "wrong existing file format $_\n";     }   }}#my @stats = qw( BW_PER_TYPE BW_TOTALS BW_PERNODE BW_PERNODE_IN BW_SPE1NODE BW_SPE2NODE BW_SPE3NODE BW_SPE1NODE_IN BW_SPE2NODE_IN BW_SPE3NODE_IN LOOKUP_RATES CORRECT_LOOKUPS RTABLE#		INCORRECT_LOOKUPS FAILED_LOOKUPS OVERALL_LOOKUPS #		TIMEOUTS_PER_LOOKUP SLICELEADER_BW);my @stats = qw( BW_PER_TYPE BW_TOTALS LOOKUP_RATES CORRECT_LOOKUPS RTABLE		INCORRECT_LOOKUPS FAILED_LOOKUPS OVERALL_LOOKUPS 		TIMEOUTS_PER_LOOKUP SLICELEADER_BW);my @headers = ();my %stats = ();my %stats_used = ();foreach my $log (@logs) {    chomp $log;#if( !( -f $log ) ) {#	print STDERR "($log) is not a file, skipping!\n";#	next;#    }    open( LOG, "<$log" ) or die( "Couldn't open $log" );    #print STDERR "$log\n";    my @header = ("#");    my %allheader;    my @log_stats = ();    my $instats = 0;    my @stats_found = ();    $log =~ s/^.*\/([^\/]+)\.log$/$1/;    my @logname = split( /\-/, $log );    my $h =  "# ";    for( my $i = 1; $i <= $#logname; $i++ ) {	my @s = split( /\./, $logname[$i] );	$h .=  $s[0] . " ";    }    while( <LOG> ) {	if ( $instats and /(.*):: (.*)$/) {	    my $bigstat = $1;	    if( grep( /$bigstat/, @stats ) ) {		my @space = split( /\s+/, $2 );		foreach my $stat (@space) {		    my @splitstat = split( /\:/, $stat );		    if( $#splitstat != 1 ) {			die( "Bad stat in $bigstat:: $stat" );		    } else {			push @stats_found, "$bigstat:$splitstat[0]";			push @log_stats, $splitstat[1];		    }		}	    }	}elsif (/alive \d+ avg (\d+\.\d+).*longest/) {	  push @stats_found, "SHORTEST_PATH:mean";	  push @log_stats, $1;	} elsif( /mystat (\d+)/ ) {	    push @stats_found, "MY:stat";	    push @log_stats, $1;	} elsif( /\<-----STATS-----\>/ ) {	    $instats = 1;	} elsif( $instats and /\<-----ENDSTATS-----\>/ ) {	    $instats = 0;	    if (!defined($allheader{$h})) {	      push @headers, $h;	      $allheader{$h} = 1;	    }	    for( my $i = 0; $i <= $#stats_found; $i++ ) {		my $s = $stats_found[$i];		$stats_used{$s} = "true";		$stats{"$h$s"} = $log_stats[$i];	    }	}    }    close( LOG );}# now sort all the stats and print the headermy $newheader;my @final_stats = sort(keys(%stats_used));$newheader = "# ";for( my $i = 0; $i <= $#final_stats; $i++ ) {    $newheader .= "$i)$final_stats[$i] ";}if( defined $argsfile ) {    my $i = 1;    open( ARGS, "<$argsfile" ) or die( "Couldn't open args file: $argsfile" );    while( <ARGS> ) {		# skip comments	if( /^\#/ ) {	    next;	}		my @args = split( /\s+/ );	my $argname = shift(@args);		$newheader .= "param$i)$argname ";	$i++;    }    close( ARGS );}$newheader .= "\n";if (defined($oldheader)) {  if (!($newheader eq $oldheader)) {    die "headers do not match. how can i merge??\n new($newheader)\nold($oldheader)\n";  }}else {  print "$newheader";}foreach my $h (@headers) {     if (defined($exist{$h})) {  }else{    print "$h\n";    foreach my $s (@final_stats) {	if( defined $stats{"$h$s"} ) {	    print $stats{"$h$s"} . " ";	} else {	    print "0 ";	}    }    print "\n";  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -