Check if an awk array contains a value

前端 未结 2 586
爱一瞬间的悲伤
爱一瞬间的悲伤 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: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'
    

提交回复
热议问题