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

特定の入力が表示され、常に最大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'

鍵を初めてお持ちの方のためにtypevehicleenginefeaturesnotelectric

または、私のようにすでに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}))。

おすすめ記事