Проверьте, содержит ли массив awk значение
С Perl, вы можете проверить, если массив содержит значение
$ perl -e '@foo=(444,555,666); print 555 ~~ @foo ? "T" : "F"'
T
однако с awk эта аналогичная команда проверяет индексы массива, а не значения
$ awk 'BEGIN {split("444 555 666", foo); print 555 in foo ? "T" : "F"}'
F
Как проверить, содержит ли массив определенное значение с awk?
2 ответов
Awk noob здесь. Я переварил Стивен и в конечном итоге с этим, надеюсь, легче понять фрагмент ниже. Есть 2 более тонкие задачи:
- массив Awk на самом деле является словарем. Это не
["value1", "value2"]
, это больше похоже на{0: "value1", 1: "value2"}
. -
in
проверяет наличие ключей, и нет встроенного способа, чтобы проверить значения.
таким образом, вы должны преобразовать свой массив (который на самом деле является словарем) в словарь с значения как ключи.
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`
( 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]]=""} in dict'
на основе Тора комментарий эта функция делает трюк для меня:
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"
}