web-dev-qa-db-ja.com

jq:2つのレベルのキーを取得する

次のようなjsonデータがあります。

_{
  "p": {
    "d": {
      "a" : {
        "r": "foo",
        "g": 1
      },
      "b": {
        "r": "bar",
        "g": 2
      }
    },
    "c": {
      "e": {
        "r": "baz",
        "g": 1
      }
    },
    ...
  }
}
_

私は次のようなものが欲しいです:

_{
  "d": [ 
    "a",
    "b"
  ],
  "c": [
    "e"
  ]
}
_

「p」の下の第1レベルのキーのリストは_jq '.p|keys'_で取得でき、第2レベルの構造とキーはjq '.p|map(.|keys)'で取得できますが、組み合わせる方法がわかりません。それ。

キーを保持しながらJSONオブジェクトの値をマップするには、mapの代わりにmap_valuesを使用します。

jq '.p | map_values(keys)'

1.5より前のjqバージョンでは、map_valuesは定義されていません。代わりに、[]|=を使用できます。

jq '.p | . []|= keys'
9
user3899165

reduceおよびsetpathを使用するソリューションを次に示します。

  .p
| reduce keys[] as $k (
     .
   ; setpath([$k]; .[$k] | keys)
)
1
jq170727