country wrote:
I have multiple CSV files (3 for this example) with
identical record layouts except that each Server Name may not be in
all of the files. Also the CSV files might not be sorted by Server
Name.
File A
Server Name,Avg CPU,P95 CPU,Avg Mem Util,P95 Mem Util
WSOMQAVPRA05,93.75,95.87,66.67,68.13
wsomdavpra03,90.39,94,65.77,68.51
wsomddvfxa01,39.22,92.19,82.59,88.25
File B
Server Name,Avg CPU,P95 CPU,Avg Mem Util,P95 Mem Util
WSOMQAVPRA05,34.78,100,55.1,67.6
wsomdavpra03,69.04,98.55,84.07,89.73
wsomddvfxa01,92.44,97.54,67.72,71.69
wsompapgtw05,48.77,96.9,92.1,93.55
File C
Server,Avg CPU,P95 CPU,Avg Mem Util,P95 Mem Util
WSOMQAVPRA05,93.13,98.11,68.95,73.47
wsomdavpra03,68.85,97.56,76.35,98.23
wsomddvfxa01,46.97,96.29,88.23,94.02
wsompapgtw05,30.66,93.74,39.89,71.35
What I am trying to do is for each Server (in Column
1) I want to get the Avg CPU (in Column 2) from each
of the 3 files. In the files above this would produce
File OUT
WSOMQAVPRA05,93.75,34.78,93.13
wsomdavpra03,90.39,69.04,68.85
wsomddvfxa01,39.22,92.44,46.97
wsompapgtw05,0,48.77,30.66
Notice in File OUT for Server Name (wsompapgtw05),
since wsompapgtw05 does not appear in File A, the
value is replaced with '0'. How can I get perl to
place a '0' in the output file when a particular
server name appears in at least 1 of the input files,
but not in all of the input files?
The perl code I've written up to this point does not handle the
missing server and Avg.CPU value. I think that I need to add
code to first build a hash which contains the server names in a
key by going through all the files - 3 for this example - and then
iterating over that list of servers in a while loop, inserting the
value
found in the respective file or a '0'. You will see in my code, which
follows I have created 1 hash. I am not sure in perl how I might
attempt to build this additional hash with a Server Name as key
and then iterating over that list. My code so far is:
#!/usr/bin/perl
use strict;
use warnings;
###########################################
# Create File with Average CPU Numbers
###########################################
my %resultacpu;
for my $file ("FileA","FileB","FileC") {
open (my $fh,"<",$file) or die "Can't open file $file: $!";
<$fh>; # skip header line
while (my $line = <$fh>) {
my ($server,$cpua) = (split(",",$line))[0,1];
push @{$resultacpu{$server}},$cpua;
}
close $fh or die "Can't close file $file: $!";
}
open (my $nfh,">","OUT") or die "Can't open result file: $!";
for my $server (sort keys %resultacpu) {
print $nfh $server.",".join(",",@{$resultacpu{$server}})."\n";
}
close $nfh or die "Can't close result file: $!";
I would appreciate the assistance of any perl coders who might
be able to help me with this problem
Something like this? I think the only thing that needs explaining is that
the 'next if grep' line rejects the header line by ensuring that all of the
data fields after the server consist of only numeric and decimal point
characters.
HTH,
Rob
use strict;
use warnings;
local @ARGV = qw/ fileB.txt fileB.txt fileC.txt /;
my %usage;
while (<>) {
chomp;
my ($server, @data) = split /,/;
next if grep /[^0-9.]/, @data;
push @{$usage{$server}}, $data[0];
}
foreach my $server (sort keys %usage) {
my $data = $usage{$server};
print join ',', $server, @$data;
print "\n";
}
**OUTPUT**
WSOMQAVPRA05,34.78,34.78,93.13
wsomdavpra03,69.04,69.04,68.85
wsomddvfxa01,92.44,92.44,46.97
wsompapgtw05,48.77,48.77,30.66
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/