我已经处理了大量的记录(约4,500条)(使用jq),直到按每小时UTC时间分组的JSON序列(约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
函数中进行了一些尝试,但是似乎无法按照我想要的方式处理数据。我在此上花了几个小时,需要休息一下,所以您能为我提供的任何帮助或指示都将是很棒的!
答案 0 :(得分:1)
如果所有内容都已存储在内存中,则可以如下修改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] );
答案 1 :(得分:0)
如果对象流已存在于文件中,则将inputs
与-n命令行选项一起使用。
这将避免“拖延”的开销,但仍需要足够的RAM才能将整个结果装入内存。如果这对您不起作用,那么您将不得不采取绝望的措施:-)
这可能是一个有用的起点:
jq -n 'reduce inputs as $in ({}; . + $in)'