Eu tenho este arquivo JSON:
{ "key11":1010, "key12":12120, "key13":12103 }
Como posso usar jq
para verificar se algum dos valores correspondentes a a key[0-9][0-9]
é zero, fazendo com que jq
saia com sucesso se algum for e não o contrário?
Eu tenho esse script de uma pergunta anterior
#!/bin/bash
json=$(cat <<EOF
{"key11":12120,"key11_":13,"key11_yes":12107,
"key12":13492,"key12_no":9,"key12_yes":13483,
"key13":10200,"key13_no":9,"key13_yes":10191,
"key21":16756,"key21_no":30,"key21_yes":16726,
"key22":17057,"key22_no":34,"key22_yes":17023,
"key23":16798,"key23_no":25,"key23_yes":16773,
"key31":2733,"key31_yes":2733,
"key32":2561,"key32_yes":2561,
"key33":2570,"key33_yes":2570}
EOF
)
json2=$(echo ${json}|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )')
O resultado é:
{ "key11": 12120, "key12": 13492, "key13": 10200, "key21": 16756, "key22": 17057, "key23": 16798, "key31": 2733, "key32": 2561, "key33": 2570 }
Agora, quero verificar o valor anexado a todas as chaves $json2
e, se o valor de qualquer uma das entradas for zero, retorne 0
.
any
é um filtro integrado que retorna true se algum item for true e false caso contrário.--exit-status
/-e
causajq
a saída0
se a última saída não for falsa nem nula.Se você já reduziu o documento para apenas as chaves de seu interesse, como em seu script, basta fazer isso:
.[]
extrai todos os valores eany
produzirá true somente se encontrar um zero neles. Alternativamente,[.[]|.==0]|any
oumap(.==0) | any
; escolha o que achar mais claro.Você também pode fazer tudo de uma só vez, economizando um
jq
processo desperdiçado:Isso seleciona todas as chaves correspondentes e verifica se cada valor é 0 e, em seguida, canaliza a coleção de resultados por meio
any
de , saindo de 0 se houver algum zero. Se tiver certeza de que não há NaNs, você também pode multiplicá-los todos juntos comreduce
.