Check if an awk array contains a value

前端 未结 2 587
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-11 09:37

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

相关标签:
2条回答
  • 2021-01-11 10:26

    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"
    }
    
    0 讨论(0)
  • 2021-01-11 10:32

    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'
    
    0 讨论(0)
提交回复
热议问题