Solved

Search a specific field in a table

Posted on 2004-10-01
12
284 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 5
  • 2
12 Comments
 
LVL 21

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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 21

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 21

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 21

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 21

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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
how to monitor remote shell execution on linux 9 107
UNiX Script filesystem space usage Part2 54 94
Solaris 4.1.3 cloning and booting 13 87
Access_log 17 166
Installing FreeBSD… FreeBSD is a darling of an operating system. The stability and usability make it a clear choice for servers and desktops (for the cunning). Savvy?  The Ports collection makes available every popular FOSS application and packag…
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 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…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

733 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