JQ: подсчитать значения объекта гнезда на основе группы по - PullRequest
0 голосов
/ 13 декабря 2018

Json:

    [
  {
  "account": "1",
  "cost": [
      {
         "usage":"low",
         "totalcost": "2.01"
      }
   ]
  },
  {
  "account": "2",
  "cost": [
      {
         "usage":"low",
         "totalcost": "2.25"
      }
   ]
  },
  {
  "account": "1",
  "cost": [
      {
         "usage":"low",
         "totalcost": "15"
      }
   ]
  },
  {
  "anotheraccount": "a",
  "cost": [
      {
         "usage":"low",
         "totalcost": "2"
      }
   ]
  }
]

Ожидаемые результаты:

account cost
1       17.01
2       2.25
anotheraccount cost
a              2

Я могу извлечь данные, но не уверен, как их агрегировать.

jq '.[] | {account,cost : .cost[].totalcost}'

Есть ли способ сделать это при использовании jq, чтобы я получал все типы учетных записей и связанные с ними расходы?

1 Ответ

0 голосов
/ 13 декабря 2018

Две вспомогательные функции помогут вам доставить вас к месту назначения:

def sigma( f ): reduce .[] as $o (null; . + ($o | f )) ;

def group( keyname ):
  map(select(has(keyname)))
  | group_by( .[keyname] )
  | map({(keyname) : .[0][keyname], 
          cost: sigma(.cost[].totalcost | tonumber) })
;

С этим следующие вызовы:

group("account"),
group("anotheraccount")

yield:

[{"account":"1","cost":17.009999999999998},{"account":"2","cost":2.25}]
[{"anotheraccount":"a","cost":2}]

Вы должны быть в состоянии управлять последним шагом форматирования в JQ.

...