Json

jq 列印鍵數組為空或缺少鍵的元素的值

  • September 2, 2018
{
   "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,我想要typewhere的值vehicle[].features[]是空數組或缺少vehicle[].features[].engine[].electric元素。

所以這個 json 應該列出我trucktrain因為卡車有一個空數組vehicle[].features[],而火車缺少vehicle[].features[].engine[].electric元素。

鑑於您的特定輸入似乎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那些vehicleengine一個features有鑰匙not的人。electric

或者,如果您像我一樣perl已經知道或另一種程式語言,並且不想再學習另一種(並且非常具體)的語言,例如jqs:

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}))。

引用自:https://unix.stackexchange.com/questions/466231