【问题标题】:Count number of records processed in jq统计 jq 中处理的记录数
【发布时间】:2018-12-26 19:05:03
【问题描述】:

我开始玩 jq,现在我在与输入的每个对象交互时尝试增加字段值时卡住了。

输入文件有:

{"a" : "test1", "b" : 0}
{"a" : "test2", "b" : 0}
{"a" : "test3", "b" : 0}

PS:没有数组,每行只有1个对象。

期望的输出:

{"a" : "test1", "b" : 0}
{"a" : "test2", "b" : 1}
{"a" : "test3", "b" : 2}

我发现了一些展示如何处理数组的示例,但没有像这样的示例。

谢谢!

【问题讨论】:

    标签: json stream jq reduction memory-efficient


    【解决方案1】:

    找到了:)

    $ cat input.json |
      jq -sc 'reduce range(0,length) as $i ( .; .[$i].b = ($i+1)) |.[]'
    {"a":"test1","b":1}
    {"a":"test2","b":2}
    {"a":"test3","b":3}
    

    【讨论】:

    • 顺便说一句,jq ... input.jsonjq ... <input.jsoncat input.json | jq ... 更有效;前者让命令直接从文件中读取,而不是从连接到从文件中读取的单独可执行文件的 FIFO。
    • 并且把所有的flags(包括-c)放在命令行的front是一个好习惯; POSIX utility syntax guidelines 仅要求在第一个位置参数之前识别选项,具体参见指南 9。
    【解决方案2】:

    jq 1.5 有inputs,这为高效解决方案打开了大门:

    jq -nc '
      foreach inputs as $x (-1; .+1; 
        . as $n | $x | .["b"] = $n)' stream.json
    {"a":"test1","b":0}
    {"a":"test2","b":1}
    {"a":"test3","b":2}
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      相关资源
      最近更新 更多