Advanced For loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Advanced For loop
# 1  
Old 03-01-2005
Question Advanced For loop

Is it possible to code a FOR loop within Bourne/Korn shell of the form:

for i in somelist AND j in anotherlist
do

echo $i $j

done

Basically I have two "lists", say:

listA= "1 2 3 4 5"
listB= "a b c d e"

I want to step through these lists simultaneously and with one echo statement produce :


1 a
2 b
3 c
......
etc.

I don't want to have to mess with arrays if I don't have to. I have simple for loops that list the individual elements OK, but I'm having trouble with the simultaneous part.
# 2  
Old 03-01-2005
This assumes that variable listA actually contains the numbers 1 2 3, etc.

Code:
listA="1 2 3 4 5"
listB="a b c d e"

for i in `echo $listA`
do
    j=`echo $listB | cut -d" " -f${i}`
    echo "$i $j"
done


Last edited by dangral; 03-01-2005 at 12:09 PM.. Reason: fixed syntax error and added comment
# 3  
Old 03-01-2005
a VERY ugly hack.... gotta thing of a bit more graceful solution withOUT temp files:
Code:
#!/bin/ksh

a='1 2 3 4 5'
b='a b c d e'

echo "$a" | tr ' ' '\n' > /tmp/pa
echo "$b" | tr ' ' '\n' > /tmp/pb
for i in $(paste -d : /tmp/pa /tmp/pb)
do
   echo "[$i]"
done


Last edited by vgersh99; 03-01-2005 at 01:45 PM..
# 4  
Old 03-01-2005
Quote:
a VERY ugly hack.... gotta thing of a bit more graceful solution withOUT temp files:
Code:

#!/bin/ksh a='1 2 3 4 5' b='a b c d e' echo "$a" | tr ' ' '\n' > /tmp/pa echo "$b" | tr ' ' '\n' > /tmp/pb for i in $(paste -d : /tmp/pa /tmp/pb) do echo "[$i]" done

vgersh99 ! your script is giving the following o/p.

[1]
[a]
[2]
[b]
[3]
[c]
[4]
[d]
[5]
[e]




I do n't think we need for loop there ... Right ?
Just

Code:
#!/bin/ksh

a='1 2 3 4 5'
b='a b c d e'

echo "$a" | tr ' ' '\n' > /tmp/pa
echo "$b" | tr ' ' '\n' > /tmp/pb

paste -d " " /tmp/pa /tmp/pb

does the job.
# 5  
Old 03-01-2005
Quote:
Originally Posted by bhargav
vgersh99 ! your script is giving the following o/p.

[1]
[a]
[2]
[b]
[3]
[c]
[4]
[d]
[5]
[e]

strange - it works just fine for me on Solaris' ksh.

Quote:
Originally Posted by bhargav
I do n't think we need for loop there ... Right ?
Just

Code:
#!/bin/ksh

a='1 2 3 4 5'
b='a b c d e'

echo "$a" | tr ' ' '\n' > /tmp/pa
echo "$b" | tr ' ' '\n' > /tmp/pb

paste -d " " /tmp/pa /tmp/pb

does the job.
well, the the OP wanted to iterate - maybe (s)he wants to do something special for every iteration.

<critical>
In any event - it's an ugly hack....
</critical>
# 6  
Old 03-01-2005
The ugliness is arising from the OP's decision to eschew arrays. My solution at least avoids external programs and data files:
Code:
#! /usr/bin/ksh

a="1 2 3 4 5 6"
b="a b c d e f"
a=$a" "
b=$b" "

while [[ -n $a || -n $b ]] ; do
        rest=${a##+([! ]) }
        anow=${a%%$rest}
        anow=${anow%%+( )}
        a=$rest
        rest=${b##+([! ]) }
        bnow=${b%%$rest}
        bnow=${bnow%%+( )}
        b=$rest
        echo anow = \"$anow\"   "    "  bnow=\"$bnow\"
done
exit 0

But I really would use a couple of arrays here.
# 7  
Old 03-01-2005
Quote:
Originally Posted by dangral
This assumes that variable listA actually contains the numbers 1 2 3, etc.

Code:
listA="1 2 3 4 5"
listB="a b c d e"

for i in `echo $listA`
do
    j=`echo $listB | cut -d" " -f${i}`
    echo "$i $j"
done

I'm sorry.

I just used

a= "1 2 3 4 5"

for simplicity.
Actually, using

j=`echo $listB | cut -d" " -f${i}`

is kind of like "cheating", but it is my fault for not being clear enough.

The lists are actually 3 character strings separated by spaces.
However, I am getting some really good ideas.

Thanks.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

EXPECT - advanced help

Hi, i need to automate installation (console) of product and found except as solution.iam new to expect and know basics of expect. i am struck with the following cases and need help for them to continue: 1) in every screen of installation at the end we have kind of buttons which we need to... (7 Replies)
Discussion started by: sai Harika
7 Replies

2. UNIX for Advanced & Expert Users

Help with advanced wget

Hi All, I am trying to download large no of data using wget. the URLS are saved in a file. I want to want for a few seconds after every URL is downloaded so i saw the option -w with wget but it does not seem to work. Can any one give me a working usage. wget -i ../file1t -o ../Outlog.log -N -S... (2 Replies)
Discussion started by: johnasvini
2 Replies

3. Programming

Books for advanced C

Simple question , what good book is next step in learning C. I finished with K&R and I want to go to the next step , so if someone has a good book please share title :D I looked for Advanced C programming by example but it is too expansive 400$ on Amazon :( So please tell me (7 Replies)
Discussion started by: solaris_user
7 Replies

4. Shell Programming and Scripting

advanced awk

Hi all Input group1 user1 user2 user3 group2 user4 user5 user1 group3 user6 user7 user8 Desired output group1 group2 (12 Replies)
Discussion started by: wakatana
12 Replies

5. Shell Programming and Scripting

Advanced printf

I want to print: WELCOME TO MY WORLD Where "WELCOME TO MY WORLD" will be in green (32) and the underline will be in yellow (33). How can i do the above using printf. printf "`tput smul`\033 leaves both the text and the underline in green. (3 Replies)
Discussion started by: proactiveaditya
3 Replies

6. Shell Programming and Scripting

advanced deletion

How can i delete the contents of the directory except one file? (8 Replies)
Discussion started by: proactiveaditya
8 Replies

7. UNIX for Advanced & Expert Users

Advanced I/O

What is Stream Devices and Stream pipes? Explain Advanced I/O ? (1 Reply)
Discussion started by: thangappan
1 Replies

8. Shell Programming and Scripting

Advanced replace

Hello, How can I replace the following with null from a file ";var "d=e";"^x" replace "";var "d=e";"^x"" "" -- filename ; doesnot work nor if I use \ in between. Please advise. Thanks (10 Replies)
Discussion started by: fed.linuxgossip
10 Replies

9. UNIX for Dummies Questions & Answers

Advanced LS?

My goal is simply to output a listing of all files in a directory and all subdirectories, one per line, ****with their full path****. The *** part is what I can't figure out. I can get one on a line and I like having the extra info, so I'm using ls -Rl right now. But what I get is just the... (2 Replies)
Discussion started by: bostonrobot
2 Replies

10. Shell Programming and Scripting

Advanced Getopts

Hi all, I am using getops to get the arguments passed by the command line. However, I need to specify some rules regarding the parameter sent. For eg: I have script called MyScript which accept parameter d, I, E, r, u so the usage should be like this: MyScript So far, I finished... (2 Replies)
Discussion started by: stefan_hery
2 Replies
Login or Register to Ask a Question