【问题标题】:reducing stream data to single result without putting them all into memory将流数据减少为单个结果而不将它们全部放入内存
【发布时间】:2022-12-05 19:15:57
【问题描述】:

我可以减少生产线,例如:

seq 5 | jq --slurp ' reduce .[] as $i (0;.+($i|tonumber))'

要得到

15

但这会将整个输入存入内存,我不希望这样。下列的:

seq 5 | jq ' reduce . as $i (0;.+($i|tonumber))'

产生不正确的输出

1
2
3
4
5

使用 foreach 时会发生类似情况。

什么是正确的语法?

【问题讨论】:

    标签: jq


    【解决方案1】:

    使用inputs而不是上下文.,以及--null-input(或-noption,这样上下文就不会吃掉第一项:

    seq 5 | jq -n 'reduce inputs as $i (0;.+($i|tonumber))'
    
    15
    

    Demo

    说明:如果您仅使用 . 作为上下文,您的过滤器将针对每个输入执行一次(在本例中为五次,因此五个输出为一个值)。提供 -n 选项将输入设置为 null,因此过滤器仅执行一次,而 inputinputs 依次从输入流中读取另一个/所有新项目。

    【讨论】:

    • 谢谢,你能解释一下为什么不同以及幕后发生了什么吗?
    猜你喜欢
    • 2013-10-07
    • 2015-05-29
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多