在jq中,我可以相当容易地在列表中选择一个项目:
$ echo '["a","b","c","d","e"]' | jq '.[] | select(. == ("a","c"))'
或者,如果您希望将其作为数组获取:
$ echo '["a","b","c","d","e"]' | jq 'map(select(. == ("a","c")))'
但是,如何选择不在列表中的所有项目?当然. != ("a","c")
不起作用:
$ echo '["a","b","c","d","e"]' | jq 'map(select(. != ("a","c")))'
[
"a",
"b",
"b",
"c",
"d",
"d",
"e",
"e"
]
以上为每个项目提供了两次,除了"a"
和"c
“
相同于:
$ echo '["a","b","c","d","e"]' | jq '.[] | select(. != ("a","c"))'
"a"
"b"
"b"
"c"
"d"
"d"
"e"
"e"
如何过滤出匹配项?
最简单,最可靠的(wrt jq版本)方法是使用内置的-
:
$ echo '["a","b","c","d","e"]' | jq -c '. - ["a","c"]'
["b","d","e"]
如果黑名单非常长,并且到处都是重复项,那么删除它们(例如使用unique
)可能是适当的。
这个问题也可以用解决(在JQ 1.4及以上)index
和not
,如
["a","c"] as $blacklist
| .[] | select( . as $in | $blacklist | index($in) | not)
或者,从命令行传递一个变量(jq --argjson黑名单...):
.[] | select( . as $in | $blacklist | index($in) | not)
要保留列表结构,可以使用map( select( ...) )
。
在jq 1.5或更高版本中,您也可以使用any
或all
,例如
def except(blacklist):
map( select( . as $in | blacklist | all(. != $in) ) );
参见例如,基于jq中的多个值选择条目
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句