A shell variable is just that: a shell variable. If you want to turn it into a awk variable, you need a syntax such as:
awk -v x="$x" '$2 == x {print $1}' infile
or
awk '$2 == x {print $1}' x="$x" infile
However, those suffer from a problem: escape sequences are expanded in them (and with GNU awk
4.2 or above, if $x
starts with @/
and ends in /
, it's treated as a regexp type of variable).
So, for instance if the shell variable contains the two characters backslash and n, the awk variable will end up containing the newline character (and with gawk 4.2+, if it contains @/foo/
, the awk variable will contain foo
and be of type regexp
).
Another approach (but which requires a POSIX awk or nawk (as opposed to the original awk as still found on a few odd Unices)) is to use environment variables:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Another approach (still with newer awks) is to use the ARGV array in awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile
ARGV
is actually a POSIX feature, it's just defined differently ingawk
. – Chris Down Nov 19 '12 at 20:05ARGV
andENVIRON
are POSIX but not in the original awk, sorry if I wasn't clear about that. How is it different ingawk
? – Stéphane Chazelas Nov 19 '12 at 20:13gawk
includes unrecognised options intoARGV
, whereas POSIXawk
doesn't. – Chris Down Nov 19 '12 at 20:24-f
as inawk -f script.awk arg1 arg2...
where GNU awk doesn't need a--
to mark the end of options if arg1 starts with a-
but is not a valid option in that particular version ofawk
. But that's not relevant to this matter, and I would definitely not rely on that behavior (I would include the--
nevertheless). – Stéphane Chazelas Nov 19 '12 at 20:41