如何删除除带有 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})'

如果您知道不需要的键,可以将 mapdel 结合使用:

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
)