如何不使用slurp标志将JSON序列与jq结合?

时间:2018-11-21 21:33:33

标签: javascript node.js json jq

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

我已经在mapreduce函数中进行了一些尝试,但是似乎无法按照我想要的方式处理数据。我在此上花了几个小时,需要休息一下,所以您能为我提供的任何帮助或指示都将是很棒的!

2 个答案:

答案 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)'