Как мне сложить все числа из вывода JQ - PullRequest
0 голосов
/ 28 августа 2018

У меня есть команда, которую я хотел бы суммировать все числа из вывода.

Команда выглядит так

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

Таким образом, он собирается перечислить все папки в /reports/dt=2018-08-27 и получить только _stats.json и передать его через jq из hadoop -cat и получить только .duration от json. Который, в конце концов, я получаю такой результат.

1211789 1211789 373585 495379 1211789

Но я бы хотел, чтобы команда суммировала все эти числа, чтобы они стали 4504331

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Для ясности и общности, возможно, стоит определить sigma(s), чтобы добавить поток чисел:

... | jq -n '
  def sigma(s): reduce s as $x(0;.+$x); 
  sigma(inputs | .duration)'
0 голосов
/ 28 августа 2018

Другой вариант (и тот, который работает, даже если не все ваши длительности являются целыми числами) - заставить ваш код jq выполнять свою работу:

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

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

... правильно выводится как вывод:

4504331

Замените <<<"$sample_data" конвейером на стандартный ввод по желанию.

0 голосов
/ 28 августа 2018

awk на помощь!

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

4504331
0 голосов
/ 28 августа 2018

Используйте петлю for.

total=0
for num in $(hadoop fs -ls -R /reports/dt=2018-08-27 | grep _stats.json | awk '{print $NF}' | xargs hadoop fs -cat | jq '.duration')
do
    ((total += num))
done
echo $total
...