如何在jq中选择多个字段?


102

我的输入文件如下所示:

{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}

我可以使用以下命令获取所有登录名: cat members | jq '.[].login'

但是我无法破解语法来获取登录名和ID?


您能否提供一个示例,说明您的预期输出是什么样子?登录/ ID对可以通过多种方式表示。

Answers:


144

您可以jq '.[] | .login, .id'用来获取每个登录名及其ID。


1
用户的示例输入确实看起来像对象流,但是由于他们提供了示例脚本,因此我假设将其包装在一个省略的数组中。

1
@SantiagoLapresta:不需要这种假设。jq与一系列对象配合使用时效果很好-不需要数组包装器。该...字符串最后后面的逗号需要去除,但我认为这是暗示。
Peter V.Mørch17年

56
或者,如果您只希望显示这两个字段。jq '.[] | {login, id}'
卡梅隆·塔加特

4
@CameronTaggart,如果我想显示login.name怎么办?jq '.[] | {login.name, id}'似乎有效,请问正确的方法是什么?
zyxue '18 -10-10

7
@zyxue这有效:jq '.[] | {name: .login.name, id}'
Alex Grounds

71

这对我有用:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}

这很简单,并且确实可以实现我想做的事情:拥有多个输入对象/哈希,仅接受其中一些值,同时将它们作为对象输出。
Smar

11

为了选择缩进不同级别(即第一和第二级别)的值,可以使用以下命令:

$ echo '[{"a":{"aa":1,"ab":2},"b":3,"c":4},{"a":{"aa":5,"ab":6},"b":7,"c":8}]'|jq '.[]|[.a.aa,.a.ab,.b]'

[
  1,
  2,
  3
]
[
  5,
  6,
  7
]

4

只需在此处提供一个示例(jq-1.6):

遍历数组并选择对象元素的字段以及该对象中的对象的字段

echo '[{"id":1, "private_info": {"name": "Ivy", "age": 18}}, {"id":2, "private_info": {"name": "Tommy", "aga": 18}}]' | jq ".[] | {id: .id, name: .private_info.name}" -

{
  "id": 1,
  "name": "Ivy"
}
{
  "id": 2,
  "name": "Tommy"
}

没有示例数据:

jq ".[] | {id, name: .private_info.name}" -

.[]:遍历数组

{id, name: .private_info.name}:采用.id和.private_info.name并将其分别包装为字段名称为“ id”和“ name”的对象


包装成对象以保持结构/键名称非常好,这正是我在寻找的东西
cryanbhu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.