繁体   English   中英

jq-如何基于属性值的“黑名单”选择对象

[英]jq - How to select objects based on a 'blacklist' of property values

类似于在这里回答的问题: jq-如何基于属性值的“白名单”选择对象,我想基于属性值的黑名单选择对象...

以下内容可以很好地用作白名单: curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=10' | jq --argjson whitelist '["stedolan", "dtolnay"]' '.[] | select(.author.login == $whitelist[]) | {author: .author.login, message: .commit.message}' : curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=10' | jq --argjson whitelist '["stedolan", "dtolnay"]' '.[] | select(.author.login == $whitelist[]) | {author: .author.login, message: .commit.message}' curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=10' | jq --argjson whitelist '["stedolan", "dtolnay"]' '.[] | select(.author.login == $whitelist[]) | {author: .author.login, message: .commit.message}'

{
  "author": "dtolnay",
  "message": "Remove David from maintainers"
}
{
  "author": "stedolan",
  "message": "Make jv_sort stable regardless of qsort details."
}
{
  "author": "stedolan",
  "message": "Add AppVeyor badge to README.md\n\nThanks @JanSchulz, @nicowilliams!"
}

问题是,我想否定这一点,只显示“ stedolan”和“ dtolnay”之外的作者的提交; 但是,如果我使用!=not ,我似乎会得到相同的错误结果:

nhenry@BONHENRY:~⟫ curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=10' | jq --argjson blacklist '["stedolan", "dtolnay"]' '.[] | select(.author.login == $blacklist[] | not) | .author.login' | sort | uniq -c | sort -nr
     14 "nicowilliams"
      2 "stedolan"
      1 "dtolnay"
nhenry@BONHENRY:~⟫ curl -s 'https://api.github.com/repos/stedolan/jq/commits?per_page=10' | jq --argjson blacklist '["stedolan", "dtolnay"]' '.[] | select(.author.login != $blacklist[]) | .author.login' | sort | uniq -c | sort -nr
     14 "nicowilliams"
      2 "stedolan"
      1 "dtolnay"

有什么建议么?

一种解决方案将只是使用not index

.[] | .author.login | select( . as $i | $blacklist | index($i) | not)

但是,假设您的jq具有all/2 ,则要使用它要说些什么:

.[] | .author.login | select( . as $i | all($blacklist[]; $i != .))

如果您的jq没有它,那么使用此解决方案还有一些要说的地方,其中all/2定义如下:

def all(s; condition): reduce s as $i (true; . and ($i | condition));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM