Verifique se algum valor é zero usando jq e retorne 0 ao shell script de chamada

0

Eu tenho este arquivo JSON:

{     "key11": 1010,     "key12": 12120,     "key13": 12103    }

Como posso usar jq para verificar se algum dos valores correspondentes a key[0-9][0-9] é zero, fazendo com que jq seja concluído com sucesso, se houver, e de outra forma?

Eu tenho este 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, desejo verificar o valor anexado a todas as chaves em $json2 e, em seguida, se o valor qualquer das entradas for zero, retornar 0 .

    
por pyramid13 19.05.2018 / 08:44

1 resposta

3

any é um incorporado filtro que retorna verdadeiro se qualquer item for verdadeiro , e falso caso contrário. --exit-status / -e faz com que jq saia do 0 se o último a saída não é falsa nem nula.

Se você já classificou o documento para apenas as teclas de seu interesse, como em seu script, basta fazer isso:

previous_command | jq -e 'any( .[] ; . == 0 )'

.[] extrai todos os valores e any produzirá true somente se encontrar um zero neles. Como alternativa, [.[]|.==0]|any ou map(.==0) | any ; escolha o que achar mais claro.

Você também pode fazer tudo de uma só vez, salvando um processo jq desperdiçado:

jq -e '[to_entries | .[] | select(.key | test("key[0-9][0-9]$")) | .value == 0 ] | any' data.json

Isso seleciona todas as chaves correspondentes e verifica se cada valor é 0, então canaliza a coleta de resultados através de any , saindo, assim, 0 se houver zeros. Se tiver certeza de que não há NaNs, você também pode multiplicá-los todos com reduce .

    
por 19.05.2018 / 09:03