如何删除除带有 jq 的键之外的所有键?
How do I remove all keys except one with jq?
给定一个对象列表,其中有很多我不想要的键:
[{
"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
功能的解决方案:
jq '[.[] | {name: .name}]'
接受的答案(map
)和@mauricio-tranjano 的等效答案实际上会将指定的键添加到还没有它的对象中。如果这不是您想要的行为,请考虑使用 has(_)
,例如:
$ jq -c 'map( if has("a") then {a} else {} end )'
输入:
[{id:1,a:1}, {id:2}]
输出:
[{"a":1},{}]
这将允许保留一组字段(通过正则表达式匹配)。
map(
to_entries
|map(select(.key|test("^(name)$")))
|from_entries
)
给定一个对象列表,其中有很多我不想要的键:
[{
"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
功能的解决方案:
jq '[.[] | {name: .name}]'
接受的答案(map
)和@mauricio-tranjano 的等效答案实际上会将指定的键添加到还没有它的对象中。如果这不是您想要的行为,请考虑使用 has(_)
,例如:
$ jq -c 'map( if has("a") then {a} else {} end )'
输入:
[{id:1,a:1}, {id:2}]
输出:
[{"a":1},{}]
这将允许保留一组字段(通过正则表达式匹配)。
map(
to_entries
|map(select(.key|test("^(name)$")))
|from_entries
)