How do I create an array from a file using every 3rd line


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How do I create an array from a file using every 3rd line
# 15  
Old 08-06-2009
Quote:
Originally Posted by BRH
...
One question: I'm not familiar with perl, if the _DATA_ is an external file, how do I reference it in the script?
...
Let's assume your data is in a file called "data.txt".

Code:
$
$ cat data.txt
ceName: Node-1
processName: tzMgmt
Status: PROCESS_NOT_RUNNING
ceName: Node-2
processName: tzMgmt
Status: PROCESS_RUNNING
ceName: Node-1
processName: XDM
Status: PROCESS_NOT_RUNNING
ceName: Node-2
processName: XDM
Status: PROCESS_RUNNING
$

Then the file handle in the "procheck" script could be changed to "<>", if you pass the data stream to "procheck".

So, "procheck" now looks like this -

Code:
$
$ cat procheck
#!/usr/bin/perl
my %hash;
local $/="RUNNING";
while(<>){
    if(/ceName: ([^ \n]*).*processName: ([^ \n]*).*Status: ([^ \n]*)/ms){
        $hash{$2}->{$1}=$3;
    }
}
print "processName        Status Node-1                   Status Node-2\n";
print "-----------        -------------------              -------------------\n";
foreach my $key (keys %hash){
    print $key,"  ";
    foreach my $k(keys %{$hash{$key}}){
        print $hash{$key}->{$k},"   ";
    }
    print "\n";
}
$
$

Note the change in red color.

And you run the script thusly -

Code:
$
$ # Method 1
$
$ cat data.txt | ./procheck
processName        Status Node-1                   Status Node-2
-----------        -------------------              -------------------
tzMgmt  PROCESS_NOT_RUNNING   PROCESS_RUNNING
XDM  PROCESS_NOT_RUNNING   PROCESS_RUNNING
$
$
$ # Method 2
$
$ ./procheck < data.txt
processName        Status Node-1                   Status Node-2
-----------        -------------------              -------------------
tzMgmt  PROCESS_NOT_RUNNING   PROCESS_RUNNING
XDM  PROCESS_NOT_RUNNING   PROCESS_RUNNING
$
$

Alternatively, if you do not want to pass the data from your file (via pipe or redirection), then you'll have to open the file explicitly in your script.

Assuming the file "data.txt" is in the same directory as "procheck", you'd have this -

Code:
$
$ cat procheck
#!/usr/bin/perl
my %hash;
local $/="RUNNING";
open(INPUT, "data.txt") or die "Can't open data.txt: $!";   # open the file for reading
while(<INPUT>) {                                            # loop through the records
    if(/ceName: ([^ \n]*).*processName: ([^ \n]*).*Status: ([^ \n]*)/ms){
        $hash{$2}->{$1}=$3;
    }
}
print "processName        Status Node-1                   Status Node-2\n";
print "-----------        -------------------              -------------------\n";
foreach my $key (keys %hash){
    print $key,"  ";
    foreach my $k(keys %{$hash{$key}}){
        print $hash{$key}->{$k},"   ";
    }
    print "\n";
}
close(INPUT) or die "Can't close data.txt: $!";             # done; close the file now
$
$ ./procheck
processName        Status Node-1                   Status Node-2
-----------        -------------------              -------------------
tzMgmt  PROCESS_NOT_RUNNING   PROCESS_RUNNING
XDM  PROCESS_NOT_RUNNING   PROCESS_RUNNING
$
$

HTH,
tyler_durden
# 16  
Old 08-07-2009
Quote:
Originally Posted by durden_tyler
Alternatively, if you do not want to pass the data from your file (via pipe or redirection), then you'll have to open the file explicitly in your script.

Assuming the file "data.txt" is in the same directory as "procheck", you'd have this -

Code:
$
$ cat procheck
#!/usr/bin/perl
my %hash;
local $/="RUNNING";
open(INPUT, "data.txt") or die "Can't open data.txt: $!";   # open the file for reading
while(<INPUT>) {                                            # loop through the records
    if(/ceName: ([^ \n]*).*processName: ([^ \n]*).*Status: ([^ \n]*)/ms){
        $hash{$2}->{$1}=$3;
    }
}
print "processName        Status Node-1                   Status Node-2\n";
print "-----------        -------------------              -------------------\n";
foreach my $key (keys %hash){
    print $key,"  ";
    foreach my $k(keys %{$hash{$key}}){
        print $hash{$key}->{$k},"   ";
    }
    print "\n";
}
close(INPUT) or die "Can't close data.txt: $!";             # done; close the file now
$
$ ./procheck
processName        Status Node-1                   Status Node-2
-----------        -------------------              -------------------
tzMgmt  PROCESS_NOT_RUNNING   PROCESS_RUNNING
XDM  PROCESS_NOT_RUNNING   PROCESS_RUNNING
$
$

HTH,
tyler_durden

Tyler, you made my day!Smilie The last method without piping or redirection is what I was looking for.

Thanks so much,

Bjoern
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. OS X (Apple)

Create a bash array from a flat file of whitespaces only.

Hi guys and gals... MacBook Pro. OSX 10.13.2, default bash terminal. I have a flat file 1920 bytes in size of whitespaces only. I need to put every single whitespace character into a bash array cell. Below are two methods that work, but both are seriously ugly. The first one requires that I... (7 Replies)
Discussion started by: wisecracker
7 Replies

2. Shell Programming and Scripting

From 2 files create 3rd file with uncommon data

Hi All, I have two files. File1 and File2. Want to create another file with all the records of File1 those are not present in File2. Please guide. Thanks in advanced. Anupam (3 Replies)
Discussion started by: Anupam_Halder
3 Replies

3. Shell Programming and Scripting

Bash 3.2 - Array / Regex - IF 3rd member in array ends in 5 digits then do somthing...

Trying to do some control flow parsing based on the index postion of an array member. Here is the pseudo code I am trying to write in (preferably in pure bash) where possible. I am thinking regex with do the trick, but need a little help. pesudo code if == ENDSINFIVEINTS ]]; then do... (4 Replies)
Discussion started by: briandanielz
4 Replies

4. Shell Programming and Scripting

Perl - use search keywords from array and search a file and print 3rd field when matched

Hi , I have been trying to write a perl script to do this job. But i am not able to achieve the desired result. Below is my code. my $current_value=12345; my @users=("bob","ben","tom","harry"); open DBLIST,"<","/var/tmp/DBinfo"; my @input = <DBLIST>; foreach (@users) { my... (11 Replies)
Discussion started by: chidori
11 Replies

5. Shell Programming and Scripting

Display 3rd line of a file using cut only

Hello, i want to use new line character in cut command i want to display 3rd line of a file using cut only( not by sed or head -tail command) can anyone suggest me ? Regards (12 Replies)
Discussion started by: Deepak Dutt
12 Replies

6. Solaris

Configure disk array in RAID5 and create file system

I'm new to forums, it's my first time posting. I have a sun v490 server. I just installed solaris 10.6, on the local drives. I'm being asked to do the following: For Oracle install I need “oracle” user that belong to “dba” and “oinstall” groups. File system /u01/app/oracle, 10GB (if... (6 Replies)
Discussion started by: Kjons76
6 Replies

7. Shell Programming and Scripting

How to extract 3rd line 4th column of a file

Hi, Shell script: I would need help on How to extract 3rd line 4th column of a file with single liner Thanks in advance. (4 Replies)
Discussion started by: krishnamurthig
4 Replies

8. Shell Programming and Scripting

Print starting 3rd line until end of the file.

Hi, I want to Print starting 3rd line until end of the file. Pls let me know the command. Thanks in advance. (1 Reply)
Discussion started by: smc3
1 Replies

9. Shell Programming and Scripting

create array holding characters from sring then echo array.

Hi, I wish to store $string1 in $string1array a character in each array element. Then i wish to echo the entire array to the screen so that it reads as the normal string again. I have been trying with the code below but does not work. Please help... To put string into array: ... (5 Replies)
Discussion started by: rorey_breaker
5 Replies

10. Shell Programming and Scripting

How to print 3rd to last line of file?

Hi, I have a ksh script I would like to modify. What I need it to do is look at an ever changing log file and print the 3rd to last line. Is there a command that will display this? I can not use line numbers because the file is always growing. Thanks for any help (2 Replies)
Discussion started by: NivekRaz
2 Replies
Login or Register to Ask a Question