【问题标题】:How do I select multiple fields in jq?如何在jq中选择多个字段?
【发布时间】:2016-04-22 10:20:55
【问题描述】:

我的输入文件如下所示:

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

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

但是我一直无法破解获取登录名和id的语法?

【问题讨论】:

  • 您能否举例说明您的预期输出应该是什么样的?有很多方法可以表示登录名/ID 对。

标签: jq


【解决方案1】:

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

【讨论】:

  • 用户的示例输入看起来确实像一个对象流,但由于他们提供的示例脚本,我假设它被包装在一个他们省略的数组中。
  • @SantiagoLapresta:不需要这种假设。 jq 适用于一系列对象 - 不需要数组包装器。 ... 字符串和最后一个逗号需要删除,但我认为这是隐含的。
  • 或者如果您只想显示这两个字段。 jq '.[] | {login, id}'
  • @CameronTaggart,如果我想显示login.name怎么办? jq '.[] | {login.name, id}' 似乎有效,请问正确的方法是什么?
  • @zyxue 这工作:jq '.[] | {name: .login.name, id}'
【解决方案2】:

这对我有用:

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

【讨论】:

  • 这很简单,正是我想做的事:有多个输入对象/哈希,只取其中的一些值,同时也将它们作为对象输出。
  • 现在我可以在我的数码照片上使用它:ls *jpg | xargs -n 1 exiftool -json | jq '{ SourceFile,CreateDate,CreationDate,Make,Model,DateTimeOriginal,SceneType,FileAccessDate,FileModifyDate,FileInodeChangeDate,SceneCaptureType,ModifyDate }'
  • 请注意,您没有为属性添加前缀.。我花了一段时间才意识到这一点。
【解决方案3】:

这里再举一个例子(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”的对象

【讨论】:

  • 包装到对象中以维护结构/键名很棒,正是我正在寻找的
【解决方案4】:

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

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
]

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多