Solved

# changing the output of data to the textfile

Posted on 2009-07-12
Medium Priority
210 Views
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);
``````
0
Question by:Europa MacDonald
[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
• 2
• 2

LVL 40

Expert Comment

ID: 24836542
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

LVL 40

Accepted Solution

mrjoltcola earned 2000 total points
ID: 24836558
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

Author Closing Comment

ID: 31602668
excellent, thank you
0

Author Comment

ID: 24843541
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

## Featured Post

Question has a verified solution.

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

Many time we need to work with multiple files all together. If its windows system then we can use some GUI based editor to accomplish our task. But what if you are on putty or have only CLI(Command Line Interface) as an option to  edit your files. I…