我处理了大量记录(约4500条((使用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
函数的方法,但似乎无法按我想要的方式处理数据。我已经花了几个小时在这件事上,需要休息一下,所以你能给我任何帮助或指导都会很棒!
如果所有内容都已在内存中,则可以如下修改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] );
如果对象流已经在文件中,请使用带有-n命令行选项的inputs
。
这将避免"诋毁"的开销,但仍需要足够的RAM来将整个结果放入内存。如果这对你不起作用,那么你将不得不采取绝望的措施:-(
这可能是一个有用的起点:
jq -n 'reduce inputs as $in ({}; . + $in)'