With Perl you can check if an array contains a value
$ perl -e \'@foo=(444,555,666); print 555 ~~ @foo ? \"T\" : \"F\"\'
T
However with awk
Based on Thor’s comment, this function does the trick for me:
function smartmatch(diamond, rough, x, y) {
for (x in rough) y[rough[x]]
return diamond in y
}
BEGIN {
split("444 555 666", z)
print smartmatch(555, z) ? "T" : "F"
}
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:
["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}
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'