Average from list of files

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • kumarboston
    New Member
    • Sep 2007
    • 55

    Average from list of files

    Hi All,
    I have some 10 text files with 3 columns of number in them, I am tring to calculate the average of each column and printing a file with file name tab separeted by average values of 3 columns.
    Here is my code, for the first file the program gives me correct values but after that wrong, someone could suggest me where I am wrong.

    Code:
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my ($sum1,$number_of_items1,$average1,
        $sum2,$number_of_items2,$average2,
        $sum3,$number_of_items3,$average3,
        $average_round1,$average_round2,$average_round3);
    
    my ($folder,@files,$name);
    my (@temp1,@temp2,@temp3);   
    $folder = "/home/r/codes/";
    opendir(FOLDER,$folder);
    
    @files = grep {/calc_box_.*.dat$/} readdir(FOLDER) or die "Check for the dat files";
    #print "@files";
    
    foreach my $file(@files)
    {                  
    	open(FH,"$file") or die "Check the file";
    	$name = $file;
    	$name =~ s/\.dat//g;
    	while(<FH>)
    	{
    		chomp $_;
    		if($_=~/\s(\d.*)\s(\d.*)\s(\d.*)/)
    		{
    			#print "$1\t$2\t$3\n";
    			@temp1=$1;
    			foreach my $num1(@temp1)
    			{
    				$number_of_items1++;
    				$sum1 += $num1;
    			}
    			$average1 = $sum1 / $number_of_items1;
    			
    		
    			@temp2=$2;
    			foreach my $num2(@temp2)
    			{
    				$number_of_items2++;
    				$sum2 += $num2;
    			}
    			$average2 = $sum2 / $number_of_items2;
    			
    			
    			@temp3=$3;
    			foreach my $num3(@temp3)
    			{
    				$number_of_items3++;
    				$sum3 += $num3;
    			}
    			$average3 = $sum3 / $number_of_items3;	
    		}
    	}
    	$average_round1 = sprintf '%.4f', $average1;
    	$average_round2 = sprintf '%.4f', $average2;
    	$average_round3 = sprintf '%.4f', $average3;
    	print "$name\t$average_round1\t$average_round2\t$average_round3\n";
    	
    }
    and here is the text file

    Code:
     94.9362 94.9362 103.74
    94.6093 94.6093 103.857
    94.6289 94.6289 103.697
    Thanks in advance.

    Kumar
  • KevinADC
    Recognized Expert Specialist
    • Jan 2007
    • 4092

    #2
    if you are tyring to sum and average each column individually:

    [CODE=perl]#!/usr/bin/perl
    use strict;
    use warnings;
    my ($col1, $col2, $col3);
    my $folder = "c:/perl_test";

    opendir(FOLDER, $folder) or die "Check for the dat files: $!";
    my @files = grep {/calc_box_.*.dat $/} readdir(FOLDER) ;
    close FOLDER;

    foreach my $file (@files){
    open(FH, "c:/perl_test/$file") or die "Check the file: $!";
    $file =~ s/\.dat//;
    while(<FH>){
    if ($_=~/([\d.]+)\s([\d.]+)\s([\d.]+)/){
    $col1 += $1;
    $col2 += $2;
    $col3 += $3;
    }
    }
    my $total = $.;
    close FH;

    my $average_round1 = sprintf '%.4f', $col1/$total;
    my $average_round2 = sprintf '%.4f', $col2/$total;
    my $average_round3 = sprintf '%.4f', $col3/$total;
    print "$file\t$averag e_round1\t$aver age_round2\t$av erage_round3\n" ;
    }[/CODE]

    change the path to the folder back to your path. Ask questions if you need some clarification.

    Comment

    • kumarboston
      New Member
      • Sep 2007
      • 55

      #3
      Thanks for the help.

      I also modified the program bit and its running fine.

      Thanks once again for the help.

      Kumar

      Comment

      Working...