检查awk数组是否包含值

11 arrays awk

使用Perl,您可以检查数组是否包含值

$ perl -e '@foo=(444,555,666); print 555 ~~ @foo ? "T" : "F"'
T
Run Code Online (Sandbox Code Playgroud)

但是对于awk,这个类似的命令是检查数组索引而不是值

$ awk 'BEGIN {split("444 555 666", foo); print 555 in foo ? "T" : "F"}'
F
Run Code Online (Sandbox Code Playgroud)

如何使用awk检查数组是否包含特定值?

phu*_*ehe 9

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`
($1 in valuesAsKeys) {print}
Run Code Online (Sandbox Code Playgroud)

对于单行:

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'
Run Code Online (Sandbox Code Playgroud)


小智 7

根据Thor的评论,此函数为我完成了窍门:

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"
}
Run Code Online (Sandbox Code Playgroud)