Solved

Search a specific field in a table

Posted on 2004-10-01
12
285 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: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

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

FreeBSD on EC2 FreeBSD (https://www.freebsd.org) is a robust Unix-like operating system that has been around for many years. FreeBSD is available on Amazon EC2 through Amazon Machine Images (AMIs) provided by FreeBSD developer and security office…
Why Shell Scripting? Shell scripting is a powerful method of accessing UNIX systems and it is very flexible. Shell scripts are required when we want to execute a sequence of commands in Unix flavored operating systems. “Shell” is the command line i…
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.

707 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