web-dev-qa-db-ja.com

サブオブジェクト値のjqフィルター

私はjsonファイルpeople.jsonを持っています:

{
  "Joe" : {"Job" : "Clown", "Age" : 22},
  "Sally" : {"Job" : "Programmer", "Age" : 32},
  "Anne" : {"Job" : "Clown", "Age" : 29}
}

道化師の皆さんを選びたいと思います。出力は次のようになります。

{
  "Joe" : {"Job" : "Clown", "Age" : 22},
  "Anne" : {"Job" : "Clown", "Age" : 29}
}

私は..演算子を試しました

cat people.json | jq '. | map(select(.Job == "Clown"))'

しかし、それは複数のレベルでジョーとアンと一致しているようで、私が望むより多くの出力を生成します。何か案は?ありがとう。

14
user1879313

使用する with_entriesは、そのデータをkeyおよびvalue要素を持つオブジェクトの配列として表す中間形式との間で変換します。

cat people.json | jq 'with_entries(select(.value.Job == "Clown"))'

ここのドキュメントに従って: http://stedolan.github.io/jq/manual/

19
Hans Z.

これはreduceを使用した解決策です

  . as $v
| reduce keys[] as $k (
    {};
    if $v[$k].Job == "Clown" then .[$k] = $v[$k] else . end
  )
2
jq170727