Как я могу объединить последовательность 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)'
Другие вопросы по тегам