Как я могу объединить последовательность JSON с jq без использования флага slurp?
У меня есть тонна записей (~4500), которые я обработал (используя jq) до последовательности JSON, сгруппированной по часовому времени UTC (~680 групп, все уникальные).
{
"2018-10-09T19:00:00.000Z": []
}
{
"2018-10-09T20:00:00.000Z": []
}
{
"2018-10-09T21:00:00.000Z": []
}
Я почти уверен, что вы видите, куда это идет, но я хочу объединить все это в один объект JSON для передачи в другую систему для большего удовольствия.
{
"2018-10-09T19:00:00.000Z": [],
"2018-10-09T20:00:00.000Z": [],
"2018-10-09T21:00:00.000Z": []
}
Последние две вещи, которые я делаю перед тем, как перейти к последовательности объектов:
group_by(.day)[] | { (.[0].day): . }
куда .day
дата ISO, на которую вы ссылаетесь выше.
Я попробовал несколько вещей вокруг map
а также reduce
функции, но не могу манипулировать данными так, как я хочу. Я потратил на это несколько часов, и мне нужно сделать перерыв, поэтому любая помощь или направление, на которое вы можете мне указать, было бы здорово!
2 ответа
Если все уже в памяти, вы можете изменить group_by
строка следующим образом:
reduce group_by(.day)[] as $in ({}; . + { ($in[0].day): $in }
Альтернативы group_by
поскольку group_by
влечет за собой своего рода, это может быть излишне неэффективно. Вы можете рассмотреть возможность использования варианта, такого как следующий:
# sort-free variant of group_by/1
# f must always evaluate to an integer or always to a string.
# Output: an array in the former case, or an object in the latter case
def GROUP_BY(f): reduce .[] as $x ({}; .[$x|f] += [$x] );
Если поток объектов уже находится в файле, используйте inputs
с параметром командной строки -n.
Это позволит избежать накладных расходов, связанных с "запятнанием", но все равно потребует достаточно оперативной памяти, чтобы весь результат поместился в памяти. Если это не сработает, вам придется прибегнуть к отчаянным мерам:-)
Это может быть полезной отправной точкой:
jq -n 'reduce inputs as $in ({}; . + $in)'