# changing the output of data to the textfile

the code I have below sets out data as shown :

232      356      434      767      786      854      avg 571.50      group 0011100210
124      78      333      19      68            avg 124.40

how do I change the code to make the output all of the above but on the one line:

232,356,434,767,786,854,avg1,571.50,0011100210124,78,333,19,68,avg2,124.40

``````#!/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)x10;
foreach my \$a (@arr) {
\$groups[\$a/100]++;
}
#   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);
``````
Chief slayer of dragonsAsked:
###### 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:
Try this.

The line I changed:

printf \$OUT "%s,avg1,%.2f,%s,%s,%.2f\n", join(",", @arr), \$avg1, join("", @groups), join(",", @diff), \$avg2;
``````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)x10;
foreach my \$a (@arr) {
\$groups[\$a/100]++;
}
#   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
printf \$OUT "%s,avg1,%.2f,%s,%s,%.2f\n", join(",", @arr), \$avg1, join("", @groups), join(",", @diff), \$avg2;
}

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);
``````
0
Commented:
Oops I missed the "avg2" word

printf \$OUT "%s,avg1,%.2f,%s,%s,avg2,%.2f\n", join(",", @arr), \$avg1, join("", @groups), join(",", @diff), \$avg2;
``````#!/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)x10;
foreach my \$a (@arr) {
\$groups[\$a/100]++;
}
#   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
printf \$OUT "%s,avg1,%.2f,%s,%s,avg2,%.2f\n", join(",", @arr), \$avg1, join("", @groups), join(",", @diff), \$avg2;
}

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);
``````
0

Experts Exchange Solution brought to you by

Your issues matter to us.

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:
excellent, thank you
0
Chief slayer of dragonsAuthor Commented:
so would that look like this in code to open data file and write to another file ?

use strict;
use warnings;

##### Open files

open(my \$IN,"outvim2.vim") or die "Could not open input: \$!\n";
open(my \$OUT,">groupsort.vim") or die "Could not open output: \$!\n";

my \$Group_Min = 501;
my \$Group_Max = 550;
my \$Group_Count = 10;

my @averages = qw(571.50 551.50 551.17 531.17);

my @groups = (0)x\$Group_Count;
foreach (@averages) {
my \$group = (\$_ - \$Group_Min)/\$Group_Count;   #This calculates the group
\$group = 0 if \$group < 0;    #In case you have a number below the expected min
\$group = \$Group_Count-1 if \$group >= \$Group_Count;    #In case you have a number above the expected max
\$groups[\$group]++;
}

print OUT join(", ", @groups) . "\n"
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.