Суммирование вложенных значений в jq - PullRequest
0 голосов
/ 26 сентября 2018

Я создал файл json из общедоступного API с запросом скручивания:

curl "https://gbfs.citibikenyc.com/gbfs/es/station_status.json" > citibike.json

Эта симпатичная печать в jq выглядит так:

$ jq . citibike.json
{
  "last_updated": 1537986541,
  "ttl": 10,
  "data": {
    "stations": [
      {
        "station_id": "304",
        "num_bikes_available": 22,
        "num_ebikes_available": 0,
        "num_bikes_disabled": 4,
        "num_docks_available": 7,
        "num_docks_disabled": 0,
        "is_installed": 1,
        "is_renting": 1,
        "is_returning": 0,
        "last_reported": 1537986269,
        "eightd_has_available_keys": true,
        "eightd_active_station_services": [
          {
            "id": "a58d9e34-2f28-40eb-b4a6-c8c01375657a"
          }
        ]
      },
      {
        "station_id": "359",
        "num_bikes_available": 0,
        "num_ebikes_available": 0,
        "num_bikes_disabled": 2,
        "num_docks_available": 50,
        "num_docks_disabled": 1,
        "is_installed": 1,
        "is_renting": 1,
        "is_returning": 0,
        "last_reported": 1537986120,
        "eightd_has_available_keys": false,
        "eightd_active_station_services": [
          {
            "id": "2e104e31-606a-44af-8b25-ceaffc338489"
          }
        ]
      },...

Моя цель - получитьдва числа - сумма всех значений, содержащихся в num_bikes_available и num_ebikes_available с одним JQ-запросом.

Следующие попытки приводят к ошибке:

jq -n 'reduce (inputs | .data.stations[] ) as $i ({}; .[$i.num_bikes_available] += $i.value)' citibike.json

jq 'reduce .data.stations[] as $num_bikes_available (0; . + $num_bikes_available)' citibike.json

Есть идеи, почему и как получить желаемый результат?

1 Ответ

0 голосов
/ 26 сентября 2018

С вашим вводом (преобразованным в действительный JSON) фильтр:

.data.stations
| { bikes: map(.num_bikes_available) | add,
    ebikes: map(.num_ebikes_available) | add }

создает:

{
  "bikes": 22,
  "ebikes": 0
}

Более эффективное решение будет использовать sigma, например, следующим образом:

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

.data.stations
| [sigma(.[] | .num_bikes_available),
   sigma(.[] | .num_ebikes_available)]
...