Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google site



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

Closed Thread
English Japanese Spanish French German Portuguese Italian Powered by Powered by Google
 
Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 09-15-2004
Registered User
 

Join Date: Sep 2004
Location: NYS
Posts: 2
korn shell "loops & arrays"

Hi,

I am trying to write a script which will loop until a certain action has been performed. I have two files i would like to compares.

For example:
file1 has a list of user ids (about 900) from the company's e-mail server.
file2 has a list of user ids (about 50 or so) from /etc/passwd.

I have file1 in a array, I'd like to have file2 in a loop.
When the id matches it will be redirected the output to /dev/null ,
but when the two ids do not match, I need to redirected the output to file3. This is so I can delete user that have moved on.

This was my 1st try.

#!/usr/bin/ksh
set -A array file1
for i in ${array[@]}
do
echo "==== $i vs file2 ===="
diff $i file2
done > file3

------------------------------------------

and my 2nd try.

#!/usr/bin/ksh
egrep -if file2 file1 > tmp_name
egrep -ivf tmp_name file2 > file3
rm tmp_name

-------------------------------------------

and then:


#!/usr/bin/ksh
while read username
do
while read file2
do
if [ '$file1' = '$file2' ]; then

else

if
done < file2
done < file1
Sponsored Links
  #2 (permalink)  
Old 09-15-2004
bhargav's Avatar
bhargav bhargav is offline Forum Advisor  
Registered User
 

Join Date: Sep 2004
Location: USA
Posts: 511
u can use 'comm' command to make it simple.


comm x y

where x and y are files having the list of names/userids.
  #3 (permalink)  
Old 09-16-2004
Perderabo's Avatar
Unix Daemon
 

Join Date: Aug 2001
Location: Ashburn, Virginia
Posts: 9,150
In case you want to get the ksh script running, I'll comment on that. In your first try you were moving toward a solution where you repeatedly scanned a file. Don't do that. You want to read each file once. I think something like this will work:

Code:
i=0
exec < file1
while read array[i] ; do
      ((i=i+1))
done
exec <file2
while read entry ; do
      i=0
      found=0
      while ((i<${#array[@]})) ; do
            if [[ $entry = ${array[i]} ]] ; then
                 found=1
                 break
                 ((i=i+1))
            fi
      done
      if ((found)) ; then
            echo $entry is in file1
      else
            echo $entry is not in file1
      fi
done

You might get away with something like:
set -A array $(cat file1)
but the resulting set statement must be less than the max line length. It might work at first, then fail later. The loop seems a bit safer. And it fires up a cat process. So the loop will be a bit faster too.
  #4 (permalink)  
Old 09-17-2004
Registered User
 

Join Date: Sep 2004
Location: NYS
Posts: 2
cool, thank you both.
  #5 (permalink)  
Old 09-23-2004
Registered User
 

Join Date: May 2004
Posts: 35
Question

Perderabo,

Can you please explain your code line by line? I think I fishing for the same type of solution, but a lot of it is confusing to me.
  #6 (permalink)  
Old 09-23-2004
Perderabo's Avatar
Unix Daemon
 

Join Date: Aug 2001
Location: Ashburn, Virginia
Posts: 9,150
I'm not going to explain every line. Most of it is straightforward. What is it you don't understand? The arrays? Do you know what an array is?

One thing: ${#array[@]} is the number of elements in the array.
  #7 (permalink)  
Old 09-23-2004
Registered User
 

Join Date: May 2004
Posts: 35
Lightbulb

i guess i don't know what it is. my thought of an array was a way to use multiple values for one variable name. well, I wanted to use your code of reading 2 files (lists) and using the variables on a conditional basis to print a message. (won't go any further, due to cross-posting).

ok, so in this part:


Code:
i=0
exec < file1
while read array[i] ; do
      ((i=i+1))

done

you're reading the file in and looping.

My confusion is with this part:

Code:
exec <file2
while read entry ; do
      i=0
      found=0
      while ((i<${#array[@]})) ; do
            if [[ $entry = ${array[i]} ]] ; then
                 found=1
                 break
                 ((i=i+1))
            fi
      done
      if ((found)) ; then
            echo $entry is in file1
      else
            echo $entry is not in file1
      fi
done

I assume that the found=0 is setting the count to zero? This line is the most confusing to me: while ((i<${#array[@]})) ; do

Are you saying do .. while "i" is less than the value of array[@]?
Thanks for any input.
Sponsored Links
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Development Releases: Linux Mint 4.0 Beta "Fluxbox", 4.0 Alpha "Debian" Linux Bot UNIX and Linux RSS News 0 01-04-2008 03:00 PM
Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`" Lokesha UNIX for Dummies Questions & Answers 4 12-20-2007 01:52 AM
No utpmx entry: you must exec "login" from lowest level "shell" peterpan UNIX for Dummies Questions & Answers 0 01-18-2006 04:15 AM
Find -name "*.txt" in Korn Shell Script jwperry Shell Programming and Scripting 3 07-19-2002 01:51 PM
Korn shell "select" command mpegler Shell Programming and Scripting 2 06-23-2002 10:41 PM



All times are GMT -4. The time now is 07:30 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2010. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0