Solved

Search a specific field in a table

Posted on 2004-10-01
12
282 Views
Last Modified: 2010-04-21
Hi,

I'm trying to use grep to searh for a string in a table. However I need to limit the search to a specific field as I dont want any results from the first field if it contains the string.  Then I need to print a few of the fields from the lines that contain my string in the field I need to search on.  Here's an example of my data:

Toteve     Sam      Denver
Denver     John     Aspen
Ellis          Joe       Witchita
Toms       Mary     Denver

I want to search column 3 for Denver, but not pick up the John Denver line as I'm only searching column 3.  It's easy in awk, but I cant use awk... Do I use Grep....I dont see how I can use Grep.

Thanks,

Sam
0
Comment
Question by:elwayisgod
  • 5
  • 5
  • 2
12 Comments
 
LVL 20

Expert Comment

by:tfewster
ID: 12203705
grep "Denver$" yourfile
0
 
LVL 48

Expert Comment

by:Tintin
ID: 12205592
You "can't use awk".  Warning!  Warning!  Homework question.

0
 

Author Comment

by:elwayisgod
ID: 12212593
Why does this not work?

#!/usr/bin/ksh

# Search by Name

echo "What Last Name do you want to search for: \n"
read lname


nawk -F"," '$1 == /$lname/ { print }' flight.data
0
Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
LVL 20

Expert Comment

by:tfewster
ID: 12212675
awk doesn't accept global parameter substitution in that way; You have pass parameters from the awk command line, e.g. nawk -F"," '$1 == NAME { print }' -v NAME=$lname flight.data

It occurred to me that you might be using grep because you didn't know how to do case-insensitive comparisons in awk; The answer to that is, use IGNORECASE, e.g.
lname=denVer
nawk -F"," 'BEGIN {IGNORECASE=1} $1 == NAME { print }' -v NAME=$lname flight.data

(P.S. Tintin - I agree it looks odd, but checking the profile reassured me ;-)
0
 

Author Comment

by:elwayisgod
ID: 12212745
Not sure about the -v option.  I think I can do the NAME=$lname before the print statement. However, can't figure out the -v. Here is my current script.  If i leave the -v out, it does not print the lines where 'Toteve' is present. It is just blank output.


#!/usr/bin/ksh

# Search by Name

echo "What Last Name do you want to search for: \n"
read lname
echo $lname
NAME=$lname

nawk -F"," '$1 == NAME { print }' -v flight.data
0
 
LVL 20

Expert Comment

by:tfewster
ID: 12212818
Did you try it the way I suggested?  
nawk -F"," '$1 == MYAWKVAR { print }' -v MYAWKVAR=$lname flight.data

If you don't do the assignment on the awk command line, MYAWKVAR is undefined within awk, even it it's a global variable. You're using Solaris, aren't you?  Check the -v option in the man page for nawk.  
0
 

Author Comment

by:elwayisgod
ID: 12212846
Here is my script and the results of output when I do it the way you indicated.  It thinks -v is a file, thus errors out...



SCRIPT:
#!/usr/bin/ksh

# Search by Name

echo "What Last Name do you want to search for: \n"
read lname
echo $lname
NAME=$lname
echo $NAME

nawk -F"," '$ 1== NAME { print }' -v NAME=$lname flight.data

OUTPUT:

broncos:/Users/stoteve/regis/project 73 % ./name.ksh
What Last Name do you want to search for:

Toteve
Toteve
Toteve
nawk: can't open file -v
 source line number 1
broncos:/Users/stoteve/regis/project 74 %
0
 
LVL 20

Accepted Solution

by:
tfewster earned 250 total points
ID: 12212867
My deepest apologies - The "-v NAME=$lname" has to go _before_ the "program" in nawk
nawk -F"," -v NAME=$lname '$ 1== NAME { print }'  flight.data
0
 

Author Comment

by:elwayisgod
ID: 12213477
Shouldnt this sort correctly.  When I run and choose to sort by option 3, I get:

SMITH,BRAD,STL,DEN,147,DELAYED,05/11/2004
SMITH,ROD,DEN,LAX,214,ONTIME,08/21/2004

Why is DEN line not above the STL line?

#!/usr/bin/ksh

# Search by Name

cat flight.data | tr [a-z] [A-Z] > flight.data #Change data file to UPPERCASE

echo "What Last Name do you want to search for: \n"
read lname


echo "$lname" | tr [a-z] [A-Z] > lnametr
cat lnametr
NAME=`cat lnametr`

echo "What field would you like to sort your results by: \n\n
      1) Last Name \n
      2) First Name \n
      3) Departure City \n
      4) Arrival City \n
      5) Flight Number \n
      6) Departure Date \n"


read srtfld

#cat newflight.data

case "$srtfld" in
      
      1)cat newflight.data | sort +0 newflight.data
            ;;
      2)cat newflight.data | sort +1 newflight.data
            ;;
      3)cat newflight.data | sort +2 newflight.data  
            ;;
      4)cat newflight.data | sort +3 newflight.data
            ;;
      5)cat newflight.data | sort +4 newflight.data
            ;;
      6)cat newflight.data | sort +6 newflight.data
            ;;
      *) echo "Invalid Option.  Sorting by default 'Last Name' \n"
             cat newflight.data | sort +0 newflight.data
            ;;
            
esac



# Line 47
nawk -F"," -v NAME=`cat lnametr` '$ 1== NAME { print }'  flight.data > newflight.data
#cat newflight.data | sort +$srtfld newflight.data
0
 

Author Comment

by:elwayisgod
ID: 12213519
Nevermind, used the -t, option as it was comma delimited..

sam
0
 
LVL 20

Expert Comment

by:tfewster
ID: 12213570
Hmmm - That has nothing to do with the awk/grep questions and it's a bit unreasonable. Please see http://www.experts-exchange.com/Operating_Systems/Unix/help.jsp#hi107

However, you need to specify the delimiter character to `sort` using the -t option;  As it is, it sees each line as a single field, and this cannot sort on "field 3".

Furthermore, `cat newflight.data | sort +6 newflight.data` is redundant;  Just do `sort -t, +6 newflight.data`

Finally, newflight.data doesn't get created until the end of the script "#Line 47", so the case statement must be working on old data.  
0
 
LVL 48

Expert Comment

by:Tintin
ID: 12213588
grep is still suitable (and easier)

#!/usr/bin/ksh
echo "What Last Name do you want to search for: \c"
read lname

grep "^$lname" flight.data

For your sorting script, it would be better written as:

#!/usr/bin/ksh

echo "What Last Name do you want to search for: \c"
read lname

cat <<EOF
What field would you like to sort your results by:

     1) Last Name
     2) First Name
     3) Departure City
     4) Arrival City
     5) Flight Number
     6) Departure Date

EOF

echo "Enter option: \c"
read srtfld

case "$srtfld" in
1) sort -t, +0 newflight.data ;;
2) sort -t, +1 newflight.data ;;
3) sort -t, +2 newflight.data ;;
4) sort -t, +3 newflight.data ;;
5) sort -t, +4 newflight.data ;;
6) sort -t, +6 newflight.data ;;
*) echo "Invalid Option.  Sorting by default 'Last Name'"
   sort -t +0 flight.data
   ;;
esac

grep -i "^$lname" newflight.data
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Regular patching is part of a system administrator's tasks. However, many patches require that the system be in single-user mode before they can be installed. A cluster patch in particular can take quite a while to apply if the machine…
Using libpcap/Jpcap to capture and send packets on Solaris version (10/11) Library used: 1.      Libpcap (http://www.tcpdump.org) Version 1.2 2.      Jpcap(http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/index.html) Version 0.6 Prerequisite: 1.      GCC …
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:

778 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question