如何在jq中选择多个字段

J. *_*ser 53 jq

我的输入文件看起来像这样:

{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}
Run Code Online (Sandbox Code Playgroud)

我可以用这个得到所有的登录名: cat members | jq '.[].login'

但我无法破解语法来获取登录名和身份证?

小智 75

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

  • 或者,如果您只想显示这两个字段.`jq'.[] | {login,id}'` (28认同)
  • @zyxue 这有效:`jq'。[] | {名称:.login.name,id}'` (11认同)
  • @CameronTaggart,如果我想显示`login.name`怎么办?`jq'.[] | {login.name, id}'` 似乎有效,请问正确的方法是什么? (6认同)
  • 用户的示例输入确实看起来像对象流,但由于他们提供的示例脚本,我假设它包装在他们省略的数组中。 (3认同)

Pet*_*rch 42

这对我有用:

> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
  "a": 1,
  "b": 2
}
{
  "a": 1,
  "b": 2
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您不要在属性前加上“.”前缀。我花了一段时间才意识到这一点。 (7认同)
  • 现在我可以在我的数码照片上使用它:`ls *jpg | xargs -n 1 exiftool -json | xargs -n 1 exiftool -json | xargs -n 1 exiftool -json | xargs -n 1 jq '{ SourceFile,CreateDate,CreationDate,Make,Model,DateTimeOriginal,SceneType,FileAccessDate,FileModifyDate,FileInodeChangeDate,SceneCaptureType,ModifyDate }'` (2认同)

nek*_*uuu 12

对于 jq >= v1.7

内置函数pick对于切片对象(即投影)很有用。

$ cat example.ndjson | jq -c 'pick(.login, .id)'
{"login":"dmaxfield","id":7449977}
{"login":"eiffel","id":7449978}
Run Code Online (Sandbox Code Playgroud)

嵌套对象也可以很好地处理。

$ cat example.ndjson | jq -c 'pick(.login, .id, .nested.obj)'
{"login":"dmaxfield","id":7449977,"nested":{"obj":1.23}}
{"login":"eiffel","id":7449978,"nested":{"obj":4.56}}
Run Code Online (Sandbox Code Playgroud)

如果您的输入格式为 JSON 而不是 NDJSON,请在脚本前面添加.[].

$ cat example.json | jq '.[] | pick(.login, .id)' | jq -s '.'   
[
  {
    "login": "dmaxfield",
    "id": 7449977
  },
  {
    "login": "eiffel",
    "id": 7449978
  }
]
Run Code Online (Sandbox Code Playgroud)

对于 jq < v1.7

Use { login, id },它是 的简写{ login: .login, id: .id }

$ cat example.ndjson | jq -c '{ login, id }'                
{"login":"dmaxfield","id":7449977}
{"login":"eiffel","id":7449978}
Run Code Online (Sandbox Code Playgroud)

对于嵌套对象,可以这样写:

$ cat example.ndjson | jq -c '{ login, id, nested: { obj: .nested.obj } }'
{"login":"dmaxfield","id":7449977,"nested":{"obj":1.23}}
{"login":"eiffel","id":7449978,"nested":{"obj":4.56}}
Run Code Online (Sandbox Code Playgroud)

对于普通 JSON 文件:

$ cat example.json | jq '.[] | { login, id }' | jq -s '.'
[
  {
    "login": "dmaxfield",
    "id": 7449977
  },
  {
    "login": "eiffel",
    "id": 7449978
  }
]
Run Code Online (Sandbox Code Playgroud)

笔记

我使用了以下 NDJSON 文件和 JSON 文件。

$ cat example.ndjson 
{ "login": "dmaxfield", "id": 7449977, "foo": true, "nested": { "obj": 1.23 } }
{ "login": "eiffel", "id": 7449978, "foo": false, "nested": { "obj": 4.56 } }
$ cat example.json 
[
  { "login": "dmaxfield", "id": 7449977, "foo": true, "nested": { "obj": 1.23 } },
  { "login": "eiffel", "id": 7449978, "foo": false, "nested": { "obj": 4.56 } }
]
Run Code Online (Sandbox Code Playgroud)


小智 11

在这里再提供一个例子(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"
}
Run Code Online (Sandbox Code Playgroud)

没有示例数据:

jq ".[] | {id, name: .private_info.name}" -
Run Code Online (Sandbox Code Playgroud)

.[]: 遍历一个数组

{id, name: .private_info.name}: 将 .id 和 .private_info.name 分别包装成一个字段名为“id”和“name”的对象


vre*_*pue 6

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

$ 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
]
Run Code Online (Sandbox Code Playgroud)