tags:

views:

520

answers:

3

I have a text file which I want to filter using awk. The text file looks like this:

foo 1
bar 2
bar 0.3
bar 100
qux 1033

I want to filter those files with awk inside a bash script.

#!/bin/bash

#input file
input=myfile.txt

# I need to pass this as parameter
# cos later I want to make it more general like
# coltype=$1
col1type="foo"   

#Filters
awk '$2>0 && $1==$col1type' $input

But somehow it failed. What's the right way to do it?

+2  A: 

Single quotes inhibit variable expansion in bash:

awk '$2>0 && $1=='"$col1type"
Ignacio Vazquez-Abrams
+1  A: 

You need double quotes to allow variable interpolation, which means you then need to escape the other dollar signs with backslashes so $1 and $2 are not interpolated. Also you need double quotes around "$col1type".

awk "\$2>0 && \$1==\"$col1type\"" 
John Kugelman
+7  A: 

pass it in using -v option of awk. that way, you separate out awk variables and shell variables. Its neater also without extra quoting.

#!/bin/bash

#input file
input=myfile.txt

# I need to pass this as parameter
# cos later I want to make it more general like
# coltype=$1
col1type="foo"   

#Filters
awk -vcoltype="$col1type" '$2>0 && $1==col1type' $input
ghostdog74
The '-v' notation is POSIX compliant; older (System V-ish) versions of awk may also allow `parameter=value` without the '-v' option. It is better to be explicit - use the '-v' unless there's a problem with it on your system.
Jonathan Leffler