【问题标题】:Using jq to get the nth element of a stream of JSON entities使用 jq 获取 JSON 实体流的第 n 个元素
【发布时间】:2021-09-21 07:35:50
【问题描述】:

我有以下 json 文件,我想访问其中的第 n 个元素。

$ cat a.json
{"one":1}
{"two":2}
{"three":3}

这里的json文件是反汇编的。当我尝试时

$ jq '.[0]' a.json

我收到错误jq: error (at a.json:1): Cannot index object with number。预期的输出是{"one":1}

【问题讨论】:

标签: json select stream jq


【解决方案1】:

您的输入不是对象数组,因此您无法使用.[0] 表示法访问。你可以用-s slurp 整个输入,但你也可以使用inputs-n(空输入模式)并通过指定索引来获取第n个元素,即获取索引2处的元素

# doesn't support negative indices
jq -n '[inputs] | nth(2)' a.json 

# supports negative indices, i.e. [-1] will get the last element  
jq -n '[inputs][2]' a.json

【讨论】:

  • 请注意,使用 [inputs] 相当于 slurping,因此这种方法不是最理想的并且可能非常低效。
  • @peak:同意。我将把它留给 OP 来决定最佳解决方案,AFAIK,它似乎不是流输入
  • 不确定“它似乎不是流输入”是什么意思,因为 Q 和您的答案都认为输入是 JSON 实体流,这是相关概念在这里,不是吗?
【解决方案2】:

jq 有一个内置过滤器nth($n; s) 可以非常有效地解决此类问题。例如,要发出第二个项目,您只需调用:

jq -n 'nth(1; inputs)' a.json

请注意,项目的计数从 0 开始。

通过避免任何“slurping”(无论是使用 -s 选项,还是使用 [inputs])以及在读取请求的项目后停止来实现效率。

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2012-02-02
    • 2013-09-21
    • 2018-08-07
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多