Как я могу объединить последовательность JSON с jq без использования флага slurp? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть тонна записей (~ 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 ]

0 голосов
/ 22 ноября 2018

Если все уже в памяти, вы можете изменить строку 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] );
0 голосов
/ 22 ноября 2018

Если поток объектов уже находится в файле, используйте inputs с параметром командной строки -n.

Это позволит избежать накладных расходов на «слэпинг», но все равно потребует достаточно оперативной памяти для того, чтобы весь результат поместился в памяти.Если это не работает для вас, вам придется прибегнуть к отчаянным мерам: -)

Это может быть полезной отправной точкой:

jq -n 'reduce inputs as $in ({}; . + $in)'
...