Проверьте, содержит ли массив 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"
}