我有这个命令,我想从输出中总结所有数字.
该命令看起来像这样
$(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和传递,通过jq从hadoop -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,如其他答案中所述。)
根据输入的确切格式,您可能需要进行一些预处理才能正确处理。
比如在样品输入查尔斯·达菲的回答要么
使用inputs (请注意,-n需要避免 jq 吞下输入的第一行):
jq -n '[inputs.duration] | add' <<< "$sample_data"
Run Code Online (Sandbox Code Playgroud)
或 slurp ( -s) 并迭代 ( .[]):
jq -s '[.[].duration] | add' <<< "$sample_data"
Run Code Online (Sandbox Code Playgroud)
你add现在就可以使用。
jq '.duration | add'
Run Code Online (Sandbox Code Playgroud)
另一个选项(即使不是所有的持续时间都是整数,也可以是整数)是让你的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上的管道替换.