Howto Pass A String as Parameter in AWK within Bas

2020-07-14 17:00发布

问题:

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?

回答1:

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\"" 


回答2:

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


回答3:

"double quote single quote"

awk '{print "'$1'"}'


example:

$./a.sh arg1 
arg1


$cat a.sh 
echo "test" | awk '{print "'$1'"}'


linux tested



回答4:

Single quotes inhibit variable expansion in bash:

awk '$2>0 && $1=='"$col1type"