Associative Array with more than one item per entry


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Associative Array with more than one item per entry
# 1  
Old 10-08-2013
Associative Array with more than one item per entry

Hi all
I have a problem where i have a large list ( up to 1000 of items) and need to have 2 items pulled from it into variables in a bash script

my list is like the following and I could have it as an array or possibly an external text file maintained separately. Every line is different and will be up to 500 lines, and is rather static content, so could easily be a CSV or similar.

Code:
15, Hills District,HIL
53,Kings Langley, KIN
76,Winston Hills,WIN

My script has the first term, (the number) as a variable and needs to use this to fined the corresponding entries on that line, and write them to 2 new variables.
Eg
if $Cnum = 56 then it will return
$cname = Kings Langley
$csname = KIN

I could build and array at run time for 1 variable, but how could I do it and return the 2 varaibles?

TIA
Ken
# 2  
Old 10-08-2013
Code:
while read line;do
    Cnum=$( echo $line | cut --delimiter="," -f1 )
    cname=$( echo $line | cut --delimiter="," -f2 )
    csname=$( echo $line | cut --delimiter="," -f3 )
    echo -e "Cnum: $Cnum\ncname: $cname\ncsname: $csname"
done<file.txt

Hope this helps

or
Code:
for AR in "${ARRAY[@]}";do
...
done


Last edited by sea; 10-08-2013 at 12:22 AM..
# 3  
Old 10-08-2013
Quote:
Originally Posted by sea
Code:
while read line;do
    Cnum=$( echo $line | cut --delimiter="," -f1 )
    cname=$( echo $line | cut --delimiter="," -f2 )
    csname=$( echo $line | cut --delimiter="," -f3 )
    echo -e "Cnum: $Cnum\ncname: $cname\ncsname: $csname"
done<file.txt

Hope this helps

... ... ...
This could be done much more efficiently as:
Code:
while IFS="," read Cnum came csname;do
    echo -e "Cnum: $Cnum\ncname: $cname\ncsname: $csname"
done<file.txt

Note also that echo -e is not portable to systems conforming to the POSIX standards nor to the Single UNIX Specifications.

For maximum portability, it could be written as:
Code:
while IFS="," read Cnum came csname
do  printf "Cnum: %s\ncname: %s\ncsname: %s\n" "$Cnum" "$cname" "$csname"
done<file.txt

(Note that changing ;do at the end of the while line to the start of the next line is just my preferred shell script coding style. The shell is happy with both forms.)
This User Gave Thanks to Don Cragun For This Post:
# 4  
Old 10-08-2013
This may be what the requestor wants his bash script to do:
Code:
CNum=76
IFS="," read X cname csname < <(grep "^${CNum}," file); echo $CNum,$cname,$csname
76,Winston Hills,WIN

EDIT: Or, if you insist on arrays: either use two arrays with a common index, or concatenate the two values into one with a unique separator (which then, on retrieval, you would need to separate again).

Last edited by RudiC; 10-08-2013 at 08:39 AM..
These 2 Users Gave Thanks to RudiC For This Post:
# 5  
Old 10-13-2013
Quote:
Originally Posted by RudiC
This may be what the requestor wants his bash script to do:
Code:
CNum=76
IFS="," read X cname csname < <(grep "^${CNum}," file); echo $CNum,$cname,$csname
76,Winston Hills,WIN

EDIT: Or, if you insist on arrays: either use two arrays with a common index, or concatenate the two values into one with a unique separator (which then, on retrieval, you would need to separate again).
Thank you Rudi,
this was exactly what i need to achieve and probably the easiest way to do it.
A Single line of code to read an external file and write the data to 2 variables.

Thanks to all others that posted a solution

Ken
# 6  
Old 10-13-2013
Quote:
Originally Posted by kcpoole
Thank you Rudi,
this was exactly what i need to achieve and probably the easiest way to do it.
A Single line of code to read an external file and write the data to 2 variables.

Thanks to all others that posted a solution

Ken
Hi kcpoole,
I'm very glad that RudiC's code worked for you. Note that with the request you made in the 1st message in this thread (where you set CNum=56 and said you wanted to get:
Code:
$cname = Kings Langley
$csname = KIN

even though no line in your input file had a 1st column containing the value 56), RudiC's code would print:
Code:
56,,

rather than what you asked for.

I guess RudiC did a better job of guessing what you wanted than the rest of us who thought you just wanted to reformat your input file from comma separated fields on a line to fields with labels on multiple lines as shown in your example.
# 7  
Old 10-13-2013
Yes that is correct. I only just realised that I made a typo and should have written Cnum = 53

I suppose my proof reading needs to improve to avoid confusion.

Thanks again
Ken
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Associative array index question

I am trying to assign indexes to an associative array in a for loop but I have to use an eval command to make it work, this doesn't seem correct I don't have to do this with regular arrays For example, the following assignment fails without the eval command: #! /bin/bash read -d "\0" -a... (19 Replies)
Discussion started by: Riker1204
19 Replies

2. Shell Programming and Scripting

Using associative array for comparison

Hello together, i make something wrong... I want an array that contains information to associate it for further processing. Here is something from my bash... You will know, what I'm trying to do. I have to point out in advance, that the variable $SYSOS is changing and not as static as in my... (2 Replies)
Discussion started by: Decstasy
2 Replies

3. Shell Programming and Scripting

Morse Code with Associative Array

Continuing my quest to learn BASH, Bourne, Awk, Grep, etc. on my own through the use of a few books. I've come to an exercise that has me absolutely stumped. The specifics: 1. Using ONLY BASH scripting commands (not sed, awk, etc.), write a script to convert a string on the command line to... (22 Replies)
Discussion started by: ksmarine1980
22 Replies

4. Shell Programming and Scripting

Associative array

I have an associative array named table declare -A table table="fruit" table="veggie" table="GT" table="eminem" Now say I have a variable returning the value highway How do I find corresponding value GT ?? (this value that I find (GT in this case) is supposed to be the name of a mysql... (1 Reply)
Discussion started by: leghorn
1 Replies

5. Shell Programming and Scripting

Help with Associative array to sum & Average

Hi All, I got stuck up with shell script where i use awk. The scenario which i am working on is as below. I have a file text.txt with contents COL1 COL2 COL3 COL4 1 A 500 200 1 B 500 300 2 A 290 150 2 B 290 140 3 C 100 100 I could able to sum col 3 and col4 based on col1 using... (1 Reply)
Discussion started by: imsularif
1 Replies

6. Shell Programming and Scripting

Help needed on Associative array in awk

Hi All, I got stuck up with shell script where i use awk. The scenario which i am working on is as below. I have a file text.txt with contents COL1 COL2 COL3 COL4 1 A 500 400 1 B 500 400 1 A 500 200 2 A 290 300 2 B 290 280 3 C 100 100 I could able to sum col 3 and col4 based on... (3 Replies)
Discussion started by: imsularif
3 Replies

7. Shell Programming and Scripting

How to create dynamically associative array in PHP?

Hi, I have an html page like this: <html> <body> <form action="test.php" method = "post"> Enter your name:<input name="search" type = "text" size ="40"> <br> Enter your age:<input name="age" type = "text" size ="20"> <input type = "submit" name="submit" value="search"> <input type =... (1 Reply)
Discussion started by: vanitham
1 Replies

8. Shell Programming and Scripting

find an available item in array

Dear all, I'm have a sorted array like this: 177 220 1001 2000 2001 2003 2005 notice that 2002 and 2004 are NOT in array. Then user input a number INPUT, our script should return OUTPUT value like this: if INPUT is not in array => OUTPUT=INPUT if INPUT is in array => OUTPUT is the... (4 Replies)
Discussion started by: fongthai
4 Replies

9. Shell Programming and Scripting

Perl: Sorting an associative array

Hi, When using sort on an associative array: foreach $key (sort(keys(%opalfabet))){ $value = $opalfabet{$key}; $result .= $value; } How does it handle double values? It seems to me that it removes them, is that true? If so, is there a way to get... (2 Replies)
Discussion started by: tine
2 Replies

10. Shell Programming and Scripting

Associative Array

Hi, I am trying to make an associative array to use in a popup_menu on a website. Here is what i have: foreach $entr ( @entries ) { $temp_uid = $entr->get_value(uid); $temp_naam = $entr->get_value(sn); $s++; } This is the popup_menu i want to use it in. popup_menu(-name=>'modcon',... (4 Replies)
Discussion started by: tine
4 Replies
Login or Register to Ask a Question