Суммируйте несколько значений с помощью JQ Reduce - PullRequest
0 голосов
/ 21 ноября 2018

Как использовать функцию jq's reduce для обработки нескольких манипуляций?

При наличии такой модели, как:

{
  "usage" : {
    "os:linux" : {
      "2018_11_18" : {
        "amount" : 601046342,
        "credits" : 99783
      },
      "2018_10_18" : {
        "amount" : 839785106,
        "credits" : 173121
      }
    }
  }
}

И JQ-файла:

reduce .usage."os:linux"[] as $item (
{"credits":0,"minutes":0}; 
."credits" += $item.credits
) 

IПолучите:

{
  "credits": 272904,
  "minutes": 0
}

Круто, но я хочу подсчитать оба поля, что-то вроде:

reduce .usage."os:linux"[] as $item (
{"credits":0,"minutes":0}; 
."credits" += $item.credits,
."minutes" += $item.amount /1000/60
) 

Точки с запятой приводят к ошибкам, запятая проходит, но только обрабатывает последнюю задачу, я, е,

{
  "credits": 0,
  "minutes": 24013.85746666667
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Или более кратко:

reduce .usage."os:linux"[] as $item (
  {}; 
  .credits += $item.credits
  | .minutes += ($item.amount / 60000) )

Или ...

Или абстрагирование сокращения в функцию общего назначения sigma/1:

def sigma(s): reduce s as $s (null; . + $s);

.usage."os:linux"
| {credits: sigma(.[].credits),
   minutes: (sigma(.[].amount) / 60000) }
0 голосов
/ 21 ноября 2018

Всегда есть явный способ:

reduce .usage."os:linux"[] as $item (
  {"credits": 0, "minutes": 0 }; 
  {
    "credits": (.credits + $item.credits),
    "minutes": (.minutes + $item.amount / 60000) 
  }
)
...