Изменить форму массива jq с обобщенными данными - PullRequest
2 голосов
/ 09 января 2020

Впервые на jq, но мне удалось сгруппировать загрузку данных, которые я бы хотел обобщить в другом формате. Исходные данные после группировки по и сопоставления:

[
  {
    "Agents": "a",
    "Count": 1
  },
  {
    "Agents": "b",
    "Count": 50
  },
  {
    "Agents": "c",
    "Count": 25
  },
  {
    "Agents": "d",
    "Count": 1
  },
  {
    "Agents": "e",
    "Count": 4
  },
  {
    "Agents": "f",
    "Count": 4
  },
  {
    "Agents": "g",
    "Count": 4
  }
]

, и я хотел бы получить такой вывод:

{
  "Count": 7,
  "Agents": {
    "a": 1,
    "b": 50,
    "c": 25,
    "d": 1,
    "e": 4,
    "f": 4,
    "g": 4
  }
}

Как именно я могу сделать это в jq, пожалуйста, потому что это требует сопоставления значений в качестве поля имена?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Другой вариант, использующий reduce, это сделать. Выражение приёма принимает массив в качестве входных данных и помещает ключ как Agents, а значение - как соответствующее Count значение.

jq '{ Count: length, Agents: (reduce .[] as $d ({}; .[$d.Agents] = $d.Count)) }'

Итератор значения объекта .[], использованный для построения JSON. Для данного .["a"] он возвращает "a", то есть, как ключи построены в конечном JSON.

2 голосов
/ 09 января 2020

Используйте map для создания ввода для from_entries:

map({key: .Agents, value: .Count}) | {Count: length, Agents: from_entries}

map создает список объектов, подобных [{"key": "a", "value": 1}, ...]. from_entries превращает это в один объект {"a": 1, ...}. В конечном объекте и length, и from_entries получают один и тот же массив в качестве входных данных, а их выходные данные используются для создания конечного объекта с ключами Count и Agents.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...