检查无循环的AWK中的关联数组中是否存在值

检查无循环的AWK中的关联数组中是否存在值,awk,Awk,我想知道是否有一种方法可以检查awk中的关联数组中是否存在值,我的意思是不知道相应的键,也不循环遍历所有数组,就像Python中的dict.values()一样。让我们举一个例子,其中最后一个if语句-if(“数组中的2”)-为FALSE,我不知道如何编写它,所以它为TRUE echo -e 'a\na\nb' | \ awk ' { array[$1] += 1 } END { for (x in array){ # key, key[value]

我想知道是否有一种方法可以检查awk中的关联数组中是否存在值,我的意思是不知道相应的键,也不循环遍历所有数组,就像Python中的
dict.values()
一样。让我们举一个例子,其中最后一个if语句-
if(“数组中的2”)
-为FALSE,我不知道如何编写它,所以它为TRUE

echo -e 'a\na\nb' | \
awk '
    { array[$1] += 1 }
END {
    for (x in array){
        # key, key[value]
        print x, array[x]
    }
    if ("a" in array){
        # acces key
        print "OK for a key"
    }
    if ("2" == array["a"]){
        # access key[value]
        print "OK for a value when knowing the key"
    }
    if ("2" in array){
        # access value without knowing key ?
        print "OK for any value"}
    } else { 
        print "ERROR"
    }}'
输出:

a 2
b 1
OK for a key
OK for a value when knowing the key
ERROR
是否有方法检查数组是否包含值(本例中为“1”或“2”)


谢谢

你可以这样做

$ echo -e 'a\na\nb' | 
  awk '{a[$1]++; b[a[$1]]=$1} 
   END {for(k in a) print k,a[k]; 
        for(k in b) print k,b[k]
        if(2 in b) print "2 is in values"}'

a 2
b 1
1 b
2 a
2 is in values
注意,第二次查找
b
是通过数组
a
的值进行的。但是,唯一性注释是有效的,如果值不是唯一的,则在反向查找中会丢失相应的键。如果只是存在类型检查,则可能没有问题。

这只是显示应用于OPs代码,因此不要接受此答案,而是接受his


您可以保留一个单独的数组,该数组由在主关联数组旁边填充的值索引,并测试:

$ echo -e 'a\na\nb' |
awk '
    { array[$1] += 1; arrvals[array[$1]] }
END {
    for (x in array){
        # key, key[value]
        print x, array[x]
    }
    if ("a" in array){
        # acces key
        print "OK for a key"
    }
    if ("2" == array["a"]){
        # access key[value]
        print "OK for a value when knowing the key"
    }
    if ("2" in arrvals){
        # access value without knowing key ?
        print "OK for any value"
    } else {
        print "ERROR"
    }
}'
a 2
b 1
OK for a key
OK for a value when knowing the key
OK for any value

awk语言是建立在这样一个前提之上的,即只有语言结构才能完成其他难以完成的事情(这显然不是)-这就是为什么awk是一个小巧、简单、高效的语言,但是强大的语言,而其他语言则被不必要的语法糖分填满。

没有循环就不可能。值没有唯一性保证,因此您永远无法确定您拥有哪个值(对应于哪个键)。如果你不关心唯一性,你可以通过交换键和值来创建反向查找数组。直到我写下我的答案,我才意识到你在说什么/做什么,所以我的答案真的是你的重复(对不起!)我通常只会删除它,但我现在不打算这样做,因为我认为OP会更清楚地看到他们用来调整额外数组的相同代码结构,我认为OP和其他人可能会更清楚地看到更长的数组名。不用担心,你的答案更具说教性,也许在这种情况下更有用。