如何在jq中不加载全部数据到内存实现流数据归约为单结果?
流式归约jq输入的正确语法
你遇到的问题核心是:不带--slurp时,reduce . as $i (...)会针对每一行输入单独执行一次归约,所以每行输入都会从初始值0开始累加,结果自然就是每个数字本身。要实现流式的归约(不加载全部输入到内存),需要用jq的-n(null输入模式)结合inputs关键字来处理所有输入行:
正确命令
seq 5 | jq -n 'reduce inputs as $i (0; . + ($i | tonumber))'
执行结果
15
原理说明
-n参数让jq从null开始处理,不会自动读取第一行输入作为初始值inputs会逐个读取所有输入行(流式处理,不需要一次性加载到内存)- 整个
reduce逻辑会在所有输入行上执行一次,从初始值0开始累加每一行的数字,最终输出总和
内容的提问来源于stack exchange,提问作者Martin Mucha
相关产品推荐
相关产品推荐

