检查无循环的AWK中的关联数组中是否存在值
我想知道是否有一种方法可以检查awk中的关联数组中是否存在值,我的意思是不知道相应的键,也不循环遍历所有数组,就像Python中的检查无循环的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]
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和其他人可能会更清楚地看到更长的数组名。不用担心,你的答案更具说教性,也许在这种情况下更有用。