{
"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"
}
]
}
jq
orを使用すると、その中の値が空の配列であるか、欠落している要素になることをjmespath
望みます。type
vehicle[].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'
鍵を初めてお持ちの方のためにtype
。vehicle
engine
features
not
electric
または、私のようにすでに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})
)。