Solved

alter code to print only average and group

Posted on 2009-07-12
7
170 Views
Last Modified: 2012-05-07
I have tried changing this code to print to file only the average and the grouping to file, like this

23.43,02231
21.33,11002

could you show me how to do this please ?

I know it is altering the print OUT lines but what I am doing isnt working
and keep the time stamp at the end
#!/usr/bin/perl
use POSIX;
use strict;
use warnings;
use Data::Dumper;
use List::Util qw(sum);
 
my $startTime = time();
 
##### Open files
open(my $IN,"invim2.vim") or die "Could not open input: $!\n";
open(my $OUT,">outvim2.vim") or die "Could not open output: $!\n";
 
my @avgs1;
my @avgs2;
my ($maxavg1, $minavg1, $maxavg2, $minavg2);
 
        ##### Step 1: read a line, and split it on comma
        while(<$IN>){
        chomp;
        my @arr = split /,/;
        next unless @arr;
 
 
        # discard 1st and 2nd last and last item
        # shift @arr;
        # pop @arr;
        # pop @arr;
        # pop @arr;
 
 
        ##### Step 2: Sort data into ascending order
        @arr = sort {$a <=> $b} @arr;
        # print "arr @arr\n";
 
 
        ##### Step 3: Calculate difference between neighboring pairs
        my @diff = (map {$arr[$_] - $arr[$_-1]} (1..$#arr));
        #  print "diff @diff\n";
 
 
        ##### Step 4: Calculate amount in each group
        my @groups = (0)x5;
        foreach my $a (@arr) {
                $groups[$a/10]++;
        }
        #   print "group @groups\n";
 
 
        ##### Step 5: Calculate average
 
        my $avg1 = sum(@arr)/@arr;
        # printf "arr avg %.2f\n", $avg1;
        if(!$maxavg1 || $avg1 > $maxavg1) { $maxavg1 = $avg1; }
        if(!$minavg1 || $avg1 < $minavg1) { $minavg1 = $avg1; }
        push @avgs1, $avg1;
 
        my $avg2 = sum(@diff)/@diff;
        # printf "diff avg %.2f\n", $avg2;
        if(!$maxavg2 || $avg2 > $maxavg2) { $maxavg2 = $avg2; }
        if(!$minavg2 || $avg2 < $minavg2) { $minavg2 = $avg2; }
        push @avgs2, $avg2;
 
        ##### Step 6: Print results
        print $OUT join("\t", @arr) . "\tavg " . sprintf("%.2f\t", $avg1) . "group " . join("", @groups) . "\n";
        print $OUT join("\t", @diff) . "\t\tavg " . sprintf("%.2f\t", $avg2) . "\n";
        print $OUT "\n";
}
 
my $stopTime = time();
my $totalTime = $stopTime - $startTime;
 
#  printf "input: maxavg %d minavg %d avgavg %d\n", $maxavg1, $minavg1, sum(@avgs1)/@avgs1;
printf $OUT "For data values:\t\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs1)/@avgs1, $maxavg1, $minavg1 ;
#  printf "diff: maxavg %d minavg %d avgavg %d\n", $maxavg2, $minavg2, sum(@avgs2)/@avgs2;
printf $OUT "For data difference values:\t avg avg %.2f\t maximum avg %.2f\t minimum avg %.2f \n",
                        sum(@avgs2)/@avgs2, $maxavg2, $minavg2, ;
 
printf "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
printf $OUT "Time started: %s   Time ended: %s   Total time:  %d minutes\n",
        strftime("%H:%M", localtime($startTime)), strftime("%H:%M", localtime($stopTime)), $totalTime/60;
 
 
close($IN);
close($OUT);

Open in new window

0
Comment
Question by:MichaelGlancy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24836449
In which step?
0
 
LVL 40

Accepted Solution

by:
mrjoltcola earned 500 total points
ID: 24836452
Something like this should do:
printf $OUT "%.2f,%s\n", $avg1, join("", @groups);

Open in new window

0
 

Author Comment

by:MichaelGlancy
ID: 24836457
at the print out step 6
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Closing Comment

by:MichaelGlancy
ID: 31602661
thankyou
0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24836474
Remember printf is a special routine that comes in handy

printf <format string>, arg1, arg2, ..., argN

It correlates to the C version of printf, so see: perldoc -f printf
or see here for format specifiers. C/C++/Perl all share pretty much the same format since it originated from C.

http://www.cplusplus.com/reference/clibrary/cstdio/printf/


I like it because its easy to format the output in the format string rather than concatenating a lot of stuff together with regular print.
0
 

Author Comment

by:MichaelGlancy
ID: 24836480
ok well I can see some of that point

I have noticed

printf <....
and
printf OUT

the first is printing to the screen ? and the second to the text file ?
0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24836484
Yes. If the first argument to print or printf has no comma separating it and the next argument, then the argument is assumed to be a file stream.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…

732 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question