JQ, используя inputs
- это хороший путь.
Во-первых, вот общая ориентированная на поток функция sigma_by
:
# In this formulation, f must either always evaluate to a string or
# always to an integer, it being understood that negative integers
# might be problematic
def sigma_by(s; f; g):
reduce s as $x (null; .[$x|f] += ($x|g));
Тогда решение может быть достигнуто путем:
sigma_by(inputs; "\(.date):\(.account_no)"; .count)
при условии использования параметра командной строки -n.
выход
При вводе сэмпла результат будет:
{
"2019-04-01:1591": 0,
"2019-04-01:1592": 1
}
Изменения
Само собой разумеется, есть много возможных вариантов. В частности, может быть оправдан вариант sigma_by
, в котором используется словарь словарей, например, чтобы сэкономить место и избежать возможных проблем с синтаксическим анализом для восстановления двух строк «агрегировать по»:
def sigma_by(s; a; b; g):
reduce s as $x (null; .[$x|a][$x|b] += ($x|g));
sigma_by(inputs; .date; .account_no; .count)
Обратите внимание, что встроенный в jq "group_by" имеет существенный потенциальный недостаток для больших массивов: он использует алгоритм сортировки.