{
"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
특정 입력이 보이고 항상 최대 하나의 요소가 있다는 점을 고려하면 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})
).