JQ суммировать аналогичные элементы - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу использовать jq для суммирования элементов с одинаковым значением поля описания.Так что каждое уникальное значение поля description получает свой собственный элемент с суммированным полем суммы.

Я использую jq 1.5

До:

{ "frames":
  [
    { "description": "Stuff", "amount": 8 },
    { "description": "Stuff", "amount": 4 },
    { "description": "other_stuff", "amount": 2 },
    { "description": "more_stuff", "amount": 20 }
  ]
}

После:

{ "frames":
  [
    { "description": "Stuff": 12 },
    { "description": "other_stuff", "amount": 2 },
    { "description": "more_stuff", "amount": 20 }
  ]
}

1 Ответ

1 голос
/ 25 сентября 2019

С вашим вводом следующая программа выдает действительный JSON в духе вопроса:

def sum_by(f;g): reduce .[] as $x ({}; .[$x|f] += ($x|g));
.frames |= sum_by(.description; .amount)

Использование sum_by более эффективно, чем использование group_by по различным причинам.

Выход

{
  "frames": {
    "Stuff": 12,
    "other_stuff": 2,
    "more_stuff": 20
  }
}

Вариант

Если вы хотите, чтобы description и amount на выходе, вы могли настроить вышеуказанное следующим образом:

.frames |= 
  (sum_by(.description; .amount) 
   | to_entries 
   | map( {description: .key, amount: .value} ))

вывод будет тогда:

{
  "frames": [
    {
      "description": "Stuff",
      "amount": 12
    },
    {
      "description": "other_stuff",
      "amount": 2
    },
    {
      "description": "more_stuff",
      "amount": 20
    }
  ]
}
...