Reputation: 1399
I want to print the lines that with two columns equal to a variable, for example, input:
2607s1 NC_000067.6 95.92 49 1 1 3 50 1e-14 84.2
2607s1 NC_000067.6 97.73 44 1 0 7 50 4e-14 84.2
2607s1 NC_000067.6 97.67 43 1 0 8 50 1e-13 75.0
and variables for first and last column:
a="2607s1"; b="84.2"
and using awk command, output:
2607s1 NC_000067.6 95.92 49 1 1 3 50 1e-14 84.2
2607s1 NC_000067.6 97.73 44 1 0 7 50 4e-14 84.2
I have tried the following but not work:
awk -v '$1==$a' && '$10==$b' test_file
cat test_file|awk '$1=="($a)" && $10=="($b)"'
cat test_file|awk '$1==($a) && $10==($b)'
cat test_file|awk '$1=="$a" && $10=="$b"'
Moreover, I am running it in a while loop, so the $a
and $b
keep changing Please help..
Upvotes: 6
Views: 18350
Reputation: 26667
You are passing the shell variables to the awk command using a wrong method. It should be like
awk -v a="$a" -v b="$b" '$1==a && $10 == b'
What it does
-v a="$a"
creates an awk variable a
and assigns the value of shell variable $a
to it.
-v b="$b"
Creates awk variable b
.
OR
awk '$1==a && $10 == b' a="$a" b="$b" file
When you write a statement like this
awk -v '$1==$a' && '$10==$b' test_file
awk doesn't know what $a
$b
is because both are shell variables.
And the correct method of using -v
for passing shell variables is as in demonstrated in the examples.
From awk manuals
-v var=val --assign var=val Assign the value val to the variable var, before execution of the program begins. Such variable values are available to the BEGIN block of an AWK program.
$ cat file
2607s1 NC_000067.6 95.92 49 1 1 3 50 1e-14 84.2
2607s1 NC_000067.6 97.73 44 1 0 7 50 4e-14 84.2
2607s1 NC_000067.6 97.67 43 1 0 8 50 1e-13 75.0
$ a="2607s1"; b="84.2"
$ awk -v a="$a" -v b="$b" '$1==a && $10 == b' file
2607s1 NC_000067.6 95.92 49 1 1 3 50 1e-14 84.2
2607s1 NC_000067.6 97.73 44 1 0 7 50 4e-14 84.2
Upvotes: 15
Reputation: 41
You can also do this (this avoids using -v parameters)
awk '$1=="'$a'" && $10=="'$b'"' file
The quote '
just before $a
will turn off string interpretation.
The quote '
just after $a
will turn on string interpretation.
$a
is in this way interpreted and replaced by its value.
Upvotes: 4
Reputation: 174696
You may try the below awk command.
awk -v var1="$a" -v var2="$b" '$1==var1&&$NF==var2' file
Upvotes: 1