Perl array with row header


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl array with row header
# 1  
Old 01-18-2011
Perl array with row header

Here is the csv file file i have:

Code:
ServerName, IPAddress, Gateway, Notes
ServerA, 192.168.1.100, 192.168.1.1, This is some server
ServerB, 192.168.1.110, 192.168.1.1, This is some other server
ServerC, 192.168.1.120, 192.168.1.1, This is some other other server

I would like to have the following:

$Servername[0] = ServerA
$IPAddress[0] = 192.168.1.100
...
$Servername[1] = ServerB
...
etc...

The column headers could be any number of columns or names.

Im actually taking the output of wmic on a linux server after querying the windows via WMI.

Smilie

Here is a sample:
Code:
$Selection="*";
$WMIClass="Win32_OperatingSystem";
@Output=`wmic --delimiter "," --user "$Username"%"$Password" //$TargetHost \"Select $Selection from $WMIClass\"`;

Which would output something like:
Code:
#wmic --user DOMAIN/USERNAME%PASSWORD //Someserver "Select * FROM Win32_LocalTime"

CLASS: Win32_LocalTime
Day|DayOfWeek|Hour|Milliseconds|Minute|Month|Quarter|Second|WeekInMonth|Year
18|2|13|0|20|1|1|56|4|2011

---------- Post updated at 04:16 PM ---------- Previous update was at 03:19 PM ----------

I got it figured out:
Code:
$rowcount=0;
foreach (@Output) {
    @line = split(',',$_);
    $colcount=0;
    foreach $col (@Columns) {
        $$col[$rowcount] = $line[$colcount];
        $colcount++;
    }
    $rowcount++;
}

# 2  
Old 01-19-2011
None of our Perl experts are jumping on this, so I guess I'll give it a try. This is what I wrote:
Code:
$
$ cat readr
#! /usr/bin/perl -w

$_ = <STDIN>;
chomp;
@fields = split ',';
for ($i=0 ; $i < $#fields; $i++) {
        $fields[$i] =~ s/^ *//;
        print "field $i = $fields[$i] \n";
}

$j = 0;
while (<>) {
        chomp;
        print "line = $_ \n";
        @data = split ',';
        for ($i=0; $i < $#data; $i++) {
                $data[$i] =~ s/^ *//;
                $array = $fields[$i];     # How to combine these
                $$array[$j] = $data[$i];  # two lines?
        }
        $j++;
}

for ($i=0 ; $i <= $#ServerName; $i++) {
        print "ServerName $i = $ServerName[$i] \n";
}
$ ./readr < data1
field 0 = ServerName
field 1 = IPAddress
field 2 = Gateway
line = ServerA, 192.168.1.100, 192.168.1.1, This is some server
line = ServerB, 192.168.1.110, 192.168.1.1, This is some other server
line = ServerC, 192.168.1.120, 192.168.1.1, This is some other other server
ServerName 0 = ServerA
ServerName 1 = ServerB
ServerName 2 = ServerC
$

That last loop is just to prove that I had populated an array called ServerName. Notice the two lines that I commented. I really wanted to combine them into a single line and lose that $array scalar. But I could not find the right syntax. Can anyone kick that ball over the goalline for me?

And no fair rewriting it to use a more sensible data structure. I gave the OP what he asked for. I realize the requirements are a little odd.
# 3  
Old 01-19-2011
Quote:
Originally Posted by Perderabo
...Notice the two lines that I commented. I really wanted to combine them into a single line and lose that $array scalar. But I could not find the right syntax. Can anyone kick that ball over the goalline for me?
...
You could combine those two lines by the use of braces.

Code:
${$fields[$i]}[$j] = $data[$i];

The updated Perl program looks like this -

Code:
$
$ cat readr
#! /usr/bin/perl -w
 
$_ = <STDIN>;
chomp;
@fields = split ',';
for ($i=0 ; $i <= $#fields; $i++) {
        $fields[$i] =~ s/^ *//;
        print "field $i = $fields[$i] \n";
}
 
$j = 0;
while (<>) {
        chomp;
        print "line = $_ \n";
        @data = split ',';
        for ($i=0; $i <= $#data; $i++) {
                $data[$i] =~ s/^ *//;
#                $array = $fields[$i];     # How to combine these
#                $$array[$j] = $data[$i];  # two lines?
                ${$fields[$i]}[$j] = $data[$i];  # Like so...
        }
        $j++;
}
 
for ($i=0 ; $i <= $#ServerName; $i++) {
        print "ServerName $i = $ServerName[$i] \n";
}
for ($i=0 ; $i <= $#IPAddress; $i++) {
        print "IPAddress $i = $IPAddress[$i] \n";
}
for ($i=0 ; $i <= $#Gateway; $i++) {
        print "Gateway $i = $Gateway[$i] \n";
}
for ($i=0 ; $i <= $#Notes; $i++) {
        print "Notes $i = $Notes[$i] \n";
}
$
$

And here's a test run -

Code:
$
$ # print the data file
$
$ cat data1
ServerName, IPAddress, Gateway, Notes
ServerA, 192.168.1.100, 192.168.1.1, This is some server
ServerB, 192.168.1.110, 192.168.1.1, This is some other server
ServerC, 192.168.1.120, 192.168.1.1, This is some other other server
$
$ # feed it to the Perl program
$
$ ./readr < data1
field 0 = ServerName
field 1 = IPAddress
field 2 = Gateway
field 3 = Notes
line = ServerA, 192.168.1.100, 192.168.1.1, This is some server
line = ServerB, 192.168.1.110, 192.168.1.1, This is some other server
line = ServerC, 192.168.1.120, 192.168.1.1, This is some other other server
ServerName 0 = ServerA
ServerName 1 = ServerB
ServerName 2 = ServerC
IPAddress 0 = 192.168.1.100
IPAddress 1 = 192.168.1.110
IPAddress 2 = 192.168.1.120
Gateway 0 = 192.168.1.1
Gateway 1 = 192.168.1.1
Gateway 2 = 192.168.1.1
Notes 0 = This is some server
Notes 1 = This is some other server
Notes 2 = This is some other other server
$
$

tyler_durden
This User Gave Thanks to durden_tyler For This Post:
# 4  
Old 01-19-2011
Note that durden_tyler also fixed a bug I had in iterating over the fields. Be sure to use the corrected perl script rather than my initial attempt.
# 5  
Old 01-19-2011
another try:-


Code:
perl -F"," -wlane '
(@a = @F) and next if $.==1 ;
$i = 0 ;
map { s/^\s+// ; push @{$_},$F[$i++] } @a ;
END {
map { $j=$_ ; map { print  $_,"[$j]"," = ",${$_}[$j] } @a  ;print "\n" ; } (0 .. $#a-1) ;
}
' infile.txt

Smilie
This User Gave Thanks to ahmad.diab For This Post:
# 6  
Old 01-19-2011
Quote:
Originally Posted by ahmad.diab
another try:-

Smilie

Seeing code like this makes me realize that I have quite a ways to go before I master Perl. However it also makes me want to get there. Very impressive work!
# 7  
Old 01-20-2011
Thanks Perderabo appreciated SmilieSmilieSmilie
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk to skip header row and add string to field

The awk below does put in VUS in the 9th field but I can not seem to skip the header then add the VUS. I tried to incorporate NR >=2 and NR > 1 with no luck. Thank you :). input Chr Start End Ref Alt Func.refGene PopFreqMax CLINSIG Classification chr1 43395635 ... (5 Replies)
Discussion started by: cmccabe
5 Replies

2. Shell Programming and Scripting

At text to field 1 of header row using awk

I am just trying to insert the word "Index" using awk. The below is close but seems to add the word at the end and I can not get the syntax correct to add from the beginning. Thank you :). awk -F'\t' -v OFS='\t' '{ $-1=$-1 OFS "Index"}$1=$1' file current output Chr Start End ... (3 Replies)
Discussion started by: cmccabe
3 Replies

3. Shell Programming and Scripting

How to display the header of a matched row in a file?

Hi, So I am trying to print the first row(header) first column alongwith the matched value. But I am not sure how do I print the same, by matching a pattern located in the file eg File contents Name Place Jim NY Jill NJ Cathy CA Sam TX Daniel FL And what I want is... (2 Replies)
Discussion started by: sidnow
2 Replies

4. Shell Programming and Scripting

Exclude the header row while splitting the file

Hi All, i have script like ... "TYPE_ID" "ID" "LIST_ID" "18" "52010" "1059" "18" "52010" "1059" "18" "52010" "1059" "18" "52010" "1059" i am using the below code it's not taking the header row. awk -F"\t" -v file=test1.txt -v file1=test2.txt ' { if(... (7 Replies)
Discussion started by: bmk
7 Replies

5. UNIX for Dummies Questions & Answers

File Row Line Count without Header Footer

Hi There! I am saving the file count of all files in a directory to an output file using: wc -l * > FileCount.txt I get: 114 G4SXORD 3 G4SXORH 0 G4SXORP 117 total But this count includes header and footer. I want to subtract 2 from the count and get ... (7 Replies)
Discussion started by: gagan8877
7 Replies

6. Shell Programming and Scripting

Add column header and row header

Hi, I have an input like this 1 2 3 4 2 3 4 5 4 5 6 7 I would like to count the no. of columns and print a header with a prefix "Col". I would also like to count the no. of rows and print as first column with each line number with a prefix "Row" So, my output would be ... (2 Replies)
Discussion started by: jacobs.smith
2 Replies

7. Shell Programming and Scripting

Exclude the header row in the file to validate

Hi All, File contains header row.. we need to exclude the header row...no need to validate the first row in the file. Data in the file should take valid data(two columns)..we need to exclude the more than two columns in the file except the first line. email|firstname a|123|100 b|345... (4 Replies)
Discussion started by: bmk
4 Replies

8. UNIX for Dummies Questions & Answers

Merge all csv files in one folder considering only 1 header row and ignoring header of all others

Friends, I need help with the following in UNIX. Merge all csv files in one folder considering only 1 header row and ignoring header of all other files. FYI - All files are in same format and contains same headers. Thank you (4 Replies)
Discussion started by: Shiny_Roy
4 Replies

9. UNIX for Dummies Questions & Answers

split header row into one column

So, I have a massive file with thousands of columns I want a list of the headers in one column in another file. So I need to strip off the top line (can use head-1) But how can I convert from this format: A B C D E F G to A B C D E F G (6 Replies)
Discussion started by: polly_falconer
6 Replies

10. UNIX for Dummies Questions & Answers

insert header row into .xls

Hello, I am building an .xls file extracting info from a DB to be eventually emailed. All is good except how do I put in a header row.. like date, name of report etc. before the columns with the actual column name and data? Thanks for any assistance.. the below is after I have signed into... (11 Replies)
Discussion started by: Tish
11 Replies
Login or Register to Ask a Question