我有一个很大的JSON文件,我猜测有400万个对象。每个顶层都有嵌套的几个层次。我想将其拆分为每个10000个顶级对象的多个文件(保留每个文件的内部结构)。jq应该能够做到吗?我不确定如何。
像这样的数据:
[{ "id": 1, "user": { "name": "Nichols Cockle", "email": "ncockle0@tmall.com", "address": { "city": "Turt", "state": "Thị Trấn Yên Phú" } }, "product": { "name": "Lychee - Canned", "code": "36987-1526" } }, { "id": 2, "user": { "name": "Isacco Scrancher", "email": "iscrancher1@aol.com", "address": { "city": "Likwatang Timur", "state": "Biharamulo" } }, "product": { "name": "Beer - Original Organic Lager", "code": "47993-200" } }, { "id": 3, "user": { "name": "Elga Sikora", "email": "esikora2@statcounter.com", "address": { "city": "Wenheng", "state": "Piedra del Águila" } }, "product": { "name": "Parsley - Dried", "code": "36987-1632" } }, { "id": 4, "user": { "name": "Andria Keatch", "email": "akeatch3@salon.com", "address": { "city": "Arras", "state": "Iracemápolis" } }, "product": { "name": "Wine - Segura Viudas Aria Brut", "code": "51079-385" } }, { "id": 5, "user": { "name": "Dara Sprowle", "email": "dsprowle4@slate.com", "address": { "city": "Huatai", "state": "Kaduna" } }, "product": { "name": "Pork - Hock And Feet Attached", "code": "0054-8648" } }]
这是一个完整的对象:
{ "id": 1, "user": { "name": "Nichols Cockle", "email": "ncockle0@tmall.com", "address": { "city": "Turt", "state": "Thị Trấn Yên Phú" } }, "product": { "name": "Lychee - Canned", "code": "36987-1526" } }
每个文件都是指定数量的对象。
[编辑:此答案已根据对该问题的修订进行了修订。]
使用jq解决问题的关键是-c命令行选项,该选项以JSON- Lines格式(即,在当前情况下,每行一个对象)生成输出。然后,您可以使用诸如awk或的工具split,将这些行分配到多个文件中。
-c
awk
split
如果文件不是太大,那么最简单的方法是使用以下方法启动管道:
jq -c '.[]' INPUTFILE
如果文件太大而无法容纳在内存中,则可以使用jq的流解析器,如下所示:
jq -cn --stream 'fromstream(1|truncate_stream(inputs))'
有关流解析器的更多讨论,请参见例如jq FAQ中的相关部分:https : //github.com/stedolan/jq/wiki/FAQ#streaming-json- parser
如果要求每个输出文件都是对象数组,那么我可能会用awk一步来执行分区和重构,但是还有许多其他合理的方法。
作为参考,如果原始文件由JSON对象的流或序列组成,则适当的调用将是:
jq -n -c inputs INPUTFILE
inputs以这种方式使用允许任意有效地处理许多对象。
inputs