2016-10-07 10 views
0

jq属性リストに少なくとも必須= trueのノードのすべてのアドレスを選択したいと思います。結果リストには固有の項目が必要です。ここで任意の配列要素が条件を満たす場合は、属性を選択してください

は私のJSONです:

{ 
"nodes": [ 
    { 
     "address":"127.0.0.1", 
     "attributes": [ 
      { 
       "id":"abc", 
       "required":true 
      }, 
      { 
       "id":"def", 
       "required":true 
      }, 
      { 
       "id":"ghi", 
       "required":false 
      } 
     ] 
    }, 
    { 
     "address":"127.0.0.2", 
     "attributes": [ 
      { 
       "id":"abc", 
       "required":false 
      }, 
      { 
       "id":"def", 
       "required":false 
      } 
     ] 
    } 
] 
} 

私が最初に試してみました:

jq '.nodes[] | select(.attributes[].required == true) | .address' 

これが生成します。

"127.0.0.1" 
"127.0.0.1" 

をだから=真必要なすべてののアドレスを取得しますそれは属性セクションで見つけることができます。どのように結果リストを一意にするか? jqにもユニークなキーワードがありますが、これがどのように私を助けてくれるのか理解できませんでした。

答えて

0

uniqueを使用すると安全ですが、ソートが必要な場合があります。例えば、特定のケースでは、繰り返しはjqクエリの成果物です。意図的(「少なくとも1つ」)と「短絡」のセマンティクス(つまり、条件が真であると検索が停止する)をより正確に捕捉するため、anyを代わりに(または同様に)使用することを検討してください。

$ jq '.nodes[] 
| select(any(.attributes[]; .required == true)) 
| .address' input.json 

出力:

"127.0.0.1" 

必要な場合は、いつでもuniqueを追加することができます。

関連する問題