Check if an awk array contains a value
Awk noob here. I digested Steven's answer and ended up with this hopefully easier to understand snippet below. There are 2 more subtle problems:
- An Awk array is actually a dictionary. It's not
["value1", "value2"]
, it's more like{0: "value1", 1: "value2"}
. in
checks for keys, and there is no built-in way to check for values.
So you have to convert your array (which is actually a dictionary) to a dictionary with the values as keys.
BEGIN { split("value1 value2", valuesAsValues) # valuesAsValues = {0: "value1", 1: "value2"} for (i in valuesAsValues) valuesAsKeys[valuesAsValues[i]] = "" # valuesAsKeys = {"value1": "", "value2": ""}}# Now you can use `in`($1 in valuesAsKeys) {print}
For one-liners:
echo "A:B:C:D:E:F" | tr ':' '\n' | \awk 'BEGIN{ split("A D F", parts); for (i in parts) dict[parts[i]]=""} $1 in dict'
what I do is structure my data to take advantage of what the language provides.
So instead of saying :
BEGIN {split("444 555 666", foo); .... }
say :
BEGIN { bar[ "444" ] ; ... }
or ala another suggestion:
BEGIN { split("444 555 666", foo); for( i in FOO ) bar[foo[i]];}
remember arrays in awk are really associative arrays.