# alter code to print only average and group

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);
``````
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
In which step?
0
Commented:
Something like this should do:
``````printf \$OUT "%.2f,%s\n", \$avg1, join("", @groups);
``````
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Chief slayer of dragonsAuthor Commented:
at the print out step 6
0
Chief slayer of dragonsAuthor Commented:
thankyou
0
Commented:
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
Chief slayer of dragonsAuthor Commented:
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
Commented:
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
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Perl

From novice to tech pro — start learning today.