alter code to print only average and group

Posted on 2009-07-12
Medium Priority
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


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
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
        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) {
        #   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;

Open in new window

Question by:Europa MacDonald
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
LVL 40

Expert Comment

ID: 24836449
In which step?
LVL 40

Accepted Solution

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

Open in new window


Author Comment

by:Europa MacDonald
ID: 24836457
at the print out step 6
Technology Partners: 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:Europa MacDonald
ID: 31602661
LVL 40

Expert Comment

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.


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.

Author Comment

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

I have noticed

printf <....
printf OUT

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

Expert Comment

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.

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

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…
Six Sigma Control Plans
Suggested Courses

762 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