如何对jq输出中的所有数字求和

toy*_*toy 2 jq

我有这个命令,我想从输出中总结所有数字.

该命令看起来像这样

$(hadoop fs -ls -R /reports/dt=2018-08-27 | grep _stats.json | awk '{print $NF}' | xargs hadoop fs -cat | jq '.duration')
Run Code Online (Sandbox Code Playgroud)

所以它会列出所有的文件夹/reports/dt=2018-08-27,并只获得_stats.json和传递,通过jqhadoop -cat和只得到.duration从JSON.最后我得到了这样的结果.

1211789 1211789 373585 495379 1211789
Run Code Online (Sandbox Code Playgroud)

但我希望命令将所有这些数字加在一起成为 4504331

tör*_*kus 31

最简单的解决方案是add过滤器:

jq '[.duration] | add'
Run Code Online (Sandbox Code Playgroud)

[括号]需要围绕值总结因为add求和的值阵列,而不是流。(对于流求和,您需要更复杂的解决方案,例如 using reduce,如其他答案中所述。)


根据输入的确切格式,您可能需要进行一些预处理才能正确处理。

比如在样品输入查尔斯·达菲的回答要么


Tim*_*mmm 8

add现在就可以使用。

jq '.duration | add'
Run Code Online (Sandbox Code Playgroud)

  • @JeraldSabuM 用数组包装您的值 (2认同)

kar*_*kfa 6

awk 来救援!

$ ... | awk '{sum+=$0} END{print sum}'

4504331
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 5

另一个选项(即使不是所有的持续时间都是整数,也可以是整数)是让你的jq代码完成工作:

sample_data='{"duration": 1211789}
{"duration": 1211789}
{"duration": 373585}
{"duration": 495379}
{"duration": 1211789}'

jq -n '[inputs | .duration] | reduce .[] as $num (0; .+$num)' <<<"$sample_data"
Run Code Online (Sandbox Code Playgroud)

......正确地作为输出发出:

4504331
Run Code Online (Sandbox Code Playgroud)

<<<"$sample_data"根据需要用stdin上的管道替换.

  • 很好,但有点复杂,请参阅[我的答案](/sf/answers/4254034291/) (3认同)