2016-10-19 17 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»; Однако, если я использую != или not, мне кажется, чтобы получить тот же неправильный результат:

[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" 

Любые предложения?

ответ

0

Одним из решений было бы просто использовать index с not:

.[] | .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)); 
+0

Спасибо, это отлично работает: – user284274