2016-10-19 10 views
2

여기에 대답 값 재산의 '블랙리스트'에 기반하여 객체 선택 방법 : jq - How to select objects based on a 'whitelist' 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}'

{ 
    "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'외에 저자에서 저지른;

[email protected]:~⟫ 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" 
[email protected]:~⟫ 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를 사용하는 경우 그러나, 나는 같은 잘못된 결과를 얻을 것 같다?

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

당신의 JQ 경우 :

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

그러나, 당신의 JQ가 all/2을 가지고 가정을 사용하기위한라고 할 무언가가있다 :

답변

0

하나의 해결책은 단순히 indexnot으로 사용하는 것 그것을 가지고 있지 않다면, 다음과 같이 정의 된 all/2과 함께이 솔루션을 사용할 때 여전히 언급해야 할 것이 있습니다 :

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

감사합니다. 완벽하게 작동합니다. – user284274