jq를 사용하여 값이 0인지 확인하고 호출 쉘 스크립트에 0을 반환합니다.

jq를 사용하여 값이 0인지 확인하고 호출 쉘 스크립트에 0을 반환합니다.

이 JSON 파일이 있습니다.

{ "키11": 1010, "키12": 12120, "키13": 12103 }

jqa의 해당 값이 key[0-9][0-9]0 인지 확인하는 방법 , jq그렇다면 성공적으로 종료하고, 그렇지 않으면 종료합니까?

이전 질문에서 이 스크립트를 얻었습니다.

#!/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 )')

결과 :

{ "key11": 12120, "key12": 13492, "key13": 10200, "key21": 16756, "key22": 17057, "key23": 16798, "key31": 2733, "key32": 2561, "key33": 2570 }

이제 모든 키에 첨부된 값을 확인하고 싶습니다 $json2.어느항목의 반환 값이 0입니다 0.

답변1

any항목 중 하나라도 true인 경우 true를 반환하는 내장 필터입니다., 그렇지 않으면 거짓입니다.--exit-status/ 종료 -e원인jq0iff의 최종 출력은 false도 null도 아닙니다.

스크립트에 표시된 대로 관심 있는 키만 포함하도록 문서를 필터링한 경우 다음을 수행할 수 있습니다.

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

.[]모든 값을 가져와 any그 중 0이 발견된 경우에만 true를 출력합니다. 또는 가장 명확하다고 생각되는 것을 선택하십시오 [.[]|.==0]|any.map(.==0) | any


한 번에 모든 작업을 수행하여 낭비적인 프로세스를 줄일 수도 있습니다 jq.

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

이는 일치하는 모든 키를 선택하고 각 값이 0인지 확인한 다음 결과 컬렉션을 파이프하고 any0이 있으면 0으로 종료합니다. NaN이 없다고 확신하는 경우 NaN을 모두 곱할 수도 있습니다.reduce.

관련 정보