Вы можете использовать функцию сокращения, принимая весь JSON в качестве входных данных, итерируя по одному объекту за раз и добавляя его к конечному результату, только если есть одно вхождение
jq -n '
reduce inputs[] as $d (. ;
if [ $d.label[] | select(contains("bar")) ] | length == 1 then
. + [$d]
else
empty
end
)' \
json
Часть $d.label[] | select(contains("bar"))] |length
возвращает счетчик в массиве label
, сколько встречается bar
. Мы добавляем его к окончательному результату . + [$d]
только в том случае, если вхождение 1
или меньше 2
, которое вы можете изменить при необходимости.
Или удаленный теперь ответ от oguz-ismail , который одинаково аккуратен и эффективен. Добавлено сюда как ссылка для будущих читателей
jq '
map(
select(.label |
any(., map(select(index("bar"))); length < 2)
)
)' json