web-dev-qa-db-ja.com

jqのキーを除くすべてのキーを削除するにはどうすればよいですか?

オブジェクトのリストがあり、多くのキーが必要ない場合:

[{
    "name": "Alice",
    "group": "Admins",
    "created": "2014"
}, {
    "name": "Bob",
    "group": "Users",
    "created": "2014"
}]

これらのオブジェクトをフィルタリングして、必要なキーのみを含めるにはどうすればよいですか?

[{
    "name": "Alice"
}, {
    "name": "Bob"
}]

私はもう試した jq '.[].name'しかし、それはオブジェクトを保存するのではなく、値を抽出します。

18
Wilfred Hughes

map()関数を使用して、任意のキーをフィルタリングできます。

jq 'map({name: .name})'

更新

によって提案されました - @WilfredHughes :上記のフィルターは次のように省略できます。

jq 'map({name})'
21
Girish

不要なキーがわかっている場合は、mapdelと一緒に使用できます。

jq 'map(del (.group) | del (.created))'
17
Hans Z.

受け入れられた回答(mapを使用)および@ mauricio-tranjanoによる同等の回答は、事実上、指定されたキーをまだ持っていないオブジェクトに追加します。それが希望する動作でない場合は、has(_)の使用を検討してください。例:

$ jq -c 'map( if has("a") then {a} else {} end )'

入力:

[{id:1,a:1}, {id:2}]

出力:

[{"a":1},{}]
3
peak

map関数を使用しない別の解決策:

jq '[.[] | {name: .name}]'
3