jq는 키 배열이 비어 있거나 키가 누락된 요소의 값을 인쇄합니다.

jq는 키 배열이 비어 있거나 키가 누락된 요소의 값을 인쇄합니다.
{
    "vehicle": [
        {
            "type": "car",
            "features": [
                {
                    "airbags": "yes",
                    "engine": [
                        {
                            "electric": "yes",
                            "horsepower": "1000"
                        }
                    ],
                    "number": "ABCD 1234"
                }
            ],
            "price": "100000"
        },
        {
            "type": "truck",
            "features": [],
            "price": "500000"
        },
        {
            "type": "train",
            "features": [
                {
                    "airbags": "no",
                    "engine": [
                        {
                            "horsepower": "10000"
                        }
                    ],
                    "number": "MNOPQRST"
                }
            ],
            "price": "100000"
        }
    ]
}

jqor 를 사용하면 그 안의 값이 빈 배열이거나 누락된 요소가 되기를 jmespath원합니다 .typevehicle[].features[]vehicle[].features[].engine[].electric

truck따라서 train트럭에는 빈 배열이 있고 vehicle[].features[]기차에는 vehicle[].features[].engine[].electric요소가 누락되어 있으므로 이 json은 나를 나열해야 합니다 .

답변1

특정 입력이 보이고 항상 최대 하나의 요소가 있다는 점을 고려하면 features다음 engines을 수행할 수 있습니다.

jq -r '.vehicle[] | select(.features[0].engine[0].electric != "yes").type'

또는:

jq -r '.vehicle[] | select(.features[0].engine[0] | has("electric") | not).type'

열쇠를 처음으로 갖고 계신 분들을 위해 type.vehicleenginefeaturesnotelectric

또는 나처럼 perl이미 다른 프로그래밍 언어를 알고 있고 다음과 같은 다른(매우 구체적인) 언어를 배우고 싶지 않은 경우 jq:

perl -MJSON -l -0777 -ne '
  $j = from_json($_);
  for (@{$j->{vehicle}}) {
    print $_->{type} unless $_->{features}[0]->{engine}[0]->{electric} eq "yes"
  }' < file.js

(또는 unless defined($_->{features}[0]->{engine}[0]->{electric})).

관련 정보