我有一个巨大的json文件(15 GB),如下所示:
{
"userActivities": {
"-L3ATRosRd-bDgSmX75Z": {
"deviceId": "60ee32c2fae8dcf0",
"dow": "Friday"
}
},
"users": {
"0GTDyAepIjcKMB1XulHCYLXylFS2": {
"ageRangeMin": 21,
"age_range": {
"min": 21
},
"gender": "male"
},
"0GTDyAepIjcKMB1S2": {
"ageRangeMin": 22,
"age_range": {
"min": 20
},
"gender": "male"
}
}
}
我想像.users[]
那样提取对象,但是要使用流解析器(jq --stream
)。也就是说,我希望输出如下:
{"ageRangeMin":21,"age_range":{"min":21},"gender":"male"}
{"ageRangeMin":22,"age_range":{"min":20},"gender":"male"}
任何指导/帮助都将不胜感激。我无法理解jq --stream
的工作原理。
答案 0 :(得分:0)
如果目标是仅在json对象树的某个深度获得对象,则可以截断流。
$ jq --stream -nc 'fromstream(2|truncate_stream(inputs | select(.[0][:1] == ["users"])))'
只需确保您正在运行最新的可用jq。 truncate_stream/1
的1.5版中有一个错误,该错误会因大于1
的任何其他输入而中断。
答案 1 :(得分:0)
在input.json中输入内容后,将进行以下调用:
$ jq -nc --stream '
fromstream(inputs|select(.[0][0] == "users"))|.[][]' input.json
产量:
{"ageRangeMin":21,"age_range":{"min":21},"gender":"male"}
{"ageRangeMin":22,"age_range":{"min":20},"gender":"male"}
这个想法是首先提取“用户”键值对作为一个单键对象。
请注意,此处必须使用-n选项。