• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 5877
  • Last Modified:

Passing command line arguments to awk

How can I pass a command line argument such as $1 or $2 into an awk script?

I have written a shell script that includes some awk programming and i need to be able to call that program by typing ./program inputword and then search for inputword within awk.

For example, if I had a datafile with the following contents:

a:b:c:d:e:f:g:
g:f:e:d:c:b:a:

and i wanted to write a script to search through that file for a name that I give at the command line

awk '
$4 ~ /b/ {print $4} ' datafile

i would like to do it like this

awk '
$4 ~ /input from command line such as $1/ {print $4}' datafile

I have tried this:

awk '
$4 ~ /inputword/ {print $4}' inputword=$1 datafile

without any luck

I have to be able to run the program without having to type something like

awk -f scriptfile datafile

as it gets to confusing.

Can anyone help?


0
ianfoster
Asked:
ianfoster
  • 3
1 Solution
 
ahoffmannCommented:
2 possibilities:

1. use gawk -v varname=inputword -f awkscript datafile
   (use  varname in you awk script)

2. using traditional awk is somehow triky, you must pass in you
   strings via the data stream and then identify it uniqely
   example:

   /^SPECIAL_VALUE/ { inputword = $2; next; }
   {   # rest of script }

   call this script as follows:

   (echo SPECIAL_VALUE "your_value"; cat datafile)|awk -f script

   Keep in mind that SPECIAL_VALUE *must not* appear in datafile.
0
 
ahoffmannCommented:
(echo SPECIAL_VALUE inputword; cat datafile) | awk '/^SPECIAL_VALUE/ { pattern=$2;} $4 ~ pattern {print $4}'
0
 
ozoCommented:
awk "\$4 ~ /$1/ {print \$4}"  datafile
0
 
ianfosterAuthor Commented:
I've installed gawk on the machine but still no luck :(


Here's another example:


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

#!/bin/sh

echo "Here we go!"

# the rest of the shell script goes here


gawk -v input=$1 -F: '
$1 ~ /input/ {print $1}' datafile

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


datafile contents as follows

a:b:c:d:
a:b:c:d:
a:b:c:d:

I call the program as follows

/gawkprog a

it should print out "a" for each line but I get nothing.

it does read in the $1 part because I can do this                  

gawk -v input=$1 -F: '
{print input} ' datafile

and run it ./gawkprog a

and it will print out

a
a
a

so the problem seems to be that gawk doesnt like matching things with
the input part.

any ideas?
0
 
ahoffmannCommented:
gawk -v input=$1 -F: '$1 ~ input {print $1}' datafile

BTW, ozo's solution works also inside a shell script
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now