如何在不使用slurp标志的情况下将JSON序列与jq组合



我处理了大量记录(约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日期。

我已经尝试了一些关于mapreduce函数的方法,但似乎无法按我想要的方式处理数据。我已经花了几个小时在这件事上,需要休息一下,所以你能给我任何帮助或指导都会很棒!

如果所有内容都已在内存中,则可以如下修改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)'

相关内容

  • 没有找到相关文章

最新更新