Solved

Search a specific field in a table

Posted on 2004-10-01
12
283 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
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
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

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

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

My previous tech tip, Installing the Solaris OS From the Flash Archive On a Tape (http://www.experts-exchange.com/articles/OS/Unix/Solaris/Installing-the-Solaris-OS-From-the-Flash-Archive-on-a-Tape.html), discussed installing the Solaris Operating S…
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…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
In a previous video, we went over how to export a DynamoDB table into Amazon S3.  In this video, we show how to load the export from S3 into a DynamoDB table.

808 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