オブジェクトのリストがあり、多くのキーが必要ない場合:
[{
"name": "Alice",
"group": "Admins",
"created": "2014"
}, {
"name": "Bob",
"group": "Users",
"created": "2014"
}]
これらのオブジェクトをフィルタリングして、必要なキーのみを含めるにはどうすればよいですか?
[{
"name": "Alice"
}, {
"name": "Bob"
}]
私はもう試した jq '.[].name'
しかし、それはオブジェクトを保存するのではなく、値を抽出します。
map()
関数を使用して、任意のキーをフィルタリングできます。
jq 'map({name: .name})'
によって提案されました - @WilfredHughes
:上記のフィルターは次のように省略できます。
jq 'map({name})'
不要なキーがわかっている場合は、map
をdel
と一緒に使用できます。
jq 'map(del (.group) | del (.created))'
受け入れられた回答(map
を使用)および@ mauricio-tranjanoによる同等の回答は、事実上、指定されたキーをまだ持っていないオブジェクトに追加します。それが希望する動作でない場合は、has(_)
の使用を検討してください。例:
$ jq -c 'map( if has("a") then {a} else {} end )'
入力:
[{id:1,a:1}, {id:2}]
出力:
[{"a":1},{}]
map
関数を使用しない別の解決策:
jq '[.[] | {name: .name}]'