Как выбрать из уникальных ключей на основе значений - PullRequest
1 голос
/ 11 марта 2019

В последнее время я узнал больше о JSON и наткнулся на JSON-процессор командной строки "jq".Я пытаюсь объединить несколько файлов JSON относительно клонов из нашего репозитория Github.Некоторые из этих дат перекрываются, и поскольку к ним обращались в разные моменты дня, они имеют немного различное количество и уникальные значения.Вот пример:

[
  {
    "timestamp": "2018-12-24T00:00:00Z",
    "count": 1,
    "uniques": 1
  },
  {
    "timestamp": "2018-12-24T00:00:00Z",
    "count": 2,
    "uniques": 1
  },
  {
    "timestamp": "2018-12-24T00:00:00Z",
    "count": 3,
    "uniques": 2
  },
  {
    "timestamp": "2018-12-25T00:00:00Z",
    "count": 12,
    "uniques": 5
  },
  {
    "timestamp": "2018-12-25T00:00:00Z",
    "count": 15,
    "uniques": 9
  }
]

Полученный код должен посмотреть на временную метку, определить, является ли она уникальной, и, если нет, сохранить объект, содержащий наибольшее «количество».Пример желаемого вывода приведен ниже:

[
  {
    "timestamp": "2018-12-24T00:00:00Z",
    "count": 3,
    "uniques": 2
  },
  {
    "timestamp": "2018-12-25T00:00:00Z",
    "count": 15,
    "uniques": 9
  }
]

"jq" кажется довольно полезным инструментом, и мне удалось использовать его в нескольких других ситуациях, но я не смог понятьесли или как использовать это таким способом.Любая помощь (или направление) будет оценена!

1 Ответ

0 голосов
/ 11 марта 2019

Простое, но эффективное решение может быть получено с помощью этих двух универсальных вспомогательных функций:

def aggregate_by(s; f; g):
  reduce s as $x  (null; .[$x|f] += [$x|g]);

def max_by(s; f):
  reduce s as $s (null;
    if . == null then {s: $s, m: ($s|f)}
    else  ($s|f) as $m
    | if $m > .m then {s: $s, m: $m} else . end
    end)
  | .s ;

С ними решением является двухслойный:

[ aggregate_by(.[]; .timestamp; .)[]
  | max_by(.[]; .count) ]
...