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?
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\""
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
"double quote single quote"
awk '{print "'$1'"}'
example:
$./a.sh arg1
arg1
$cat a.sh
echo "test" | awk '{print "'$1'"}'
linux tested
Single quotes inhibit variable expansion in bash:
awk '$2>0 && $1=='"$col1type"