簡體   English   中英

如何使用jq過濾不在列表中的選擇項?

[英]how to use jq to filter select items not in list?

在JQ,我可以很容易列表選擇一個項目:

$ echo '["a","b","c","d","e"]' | jq '.[] | select(. == ("a","c"))'

或者如果您希望將其作為數組:

$ echo '["a","b","c","d","e"]' | jq 'map(select(. == ("a","c")))'

但是,如何選擇列表中沒有的所有項目? 當然. != ("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 )。

變化

問題也可以使用index解決(在jq 1.4及以上),而not ,例如

["a","c"] as $blacklist
| .[] | select( . as $in | $blacklist | index($in) | not) 

或者,從命令行傳入變量(jq --argjson blacklist ...):

.[] | select( . as $in | $blacklist | index($in) | not) 

要保留列表結構,可以使用map( select( ...) )

使用jq 1.5或更高版本,您也可以使用anyall ,例如

def except(blacklist):
  map( select( . as $in | blacklist | all(. != $in) ) );

特例:字符串

請參閱例如, 基於jq中的多個值選擇條目

我敢肯定這不是最簡單的解決方案,但它確實有效:)

$ echo '["a","b","c","d","e"]' | jq '.[] | select(test("[^ac]"))'

編輯:還有一個解決方案 - 這更糟糕:)

$ echo '["a","b","c","d","e"]' | jq '.[] | select(. != ("a") and . != ("b"))'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM