jq,拆分一个巨大的json数组并保存到一个名为

jq,拆分一个巨大的json数组并保存到一个名为,json,awk,split,jq,Json,Awk,Split,Jq,我有一个包含对象数组的json,每个对象都包含一个唯一的值: "id":"value" 我遵循了这一点,我可以使用jq和awk将整个文档拆分为多个文件 jq -c ".[]" big.json | gawk '{print > "doc00" NR ".json";}' 通过这种方式,输出文件按顺序命名。 如何使用id值命名文件?对于数组中的每个元素,在两行中分别打印id和元素本身,这样您就可以从奇数行中获取id,并将偶数行打印到以id命名的文件中 jq -cr '.[] | .id,

我有一个包含对象数组的json,每个对象都包含一个唯一的值:

"id":"value"
我遵循了这一点,我可以使用jq和awk将整个文档拆分为多个文件

jq -c ".[]" big.json | gawk '{print > "doc00" NR ".json";}'
通过这种方式,输出文件按顺序命名。
如何使用id值命名文件?

对于数组中的每个元素,在两行中分别打印id和元素本身,这样您就可以从奇数行中获取id,并将偶数行打印到以id命名的文件中

jq -cr '.[] | .id, .' big.json | awk 'NR%2{f=$0".json";next} {print >f;close(f)}'

对于数组中的每个元素,在两行中分别打印id和元素本身,这样您就可以从奇数行中获取id,并将偶数行打印到以id命名的文件中

jq -cr '.[] | .id, .' big.json | awk 'NR%2{f=$0".json";next} {print >f;close(f)}'
使用.id作为文件名的一部分充满了风险

首先,存在嵌入换行符的潜在问题

第二,存在保留字符的问题,尤其是/

第三,Windows对文件名有许多限制-请参见

此外,如果使用jq的-r选项,正如本页上另一篇文章中所建议的那样,那么.id值1和1都将映射到1,这将导致在awk中使用>时数据丢失

因此,这里有一个解决方案,说明了如何在OS X或*ix环境中实现安全性,并为Windows提供了一个安全解决方案:

jq -c '.[]
       | (.id | if type == "number" then .
                else tostring | gsub("[^A-Za-z0-9-_]";"+") end), .' |
awk '
  function fn(s) { sub(/^\"/,"",s); sub(/\"$/,"",s); return s ".json"; }
  NR%2{f=fn($0); next} 
  {print >> f; close(f);}
' 
请特别注意使用>>以避免在文件名冲突的情况下丢失数据。

使用.id作为文件名的一部分充满了风险

首先,存在嵌入换行符的潜在问题

第二,存在保留字符的问题,尤其是/

第三,Windows对文件名有许多限制-请参见

此外,如果使用jq的-r选项,正如本页上另一篇文章中所建议的那样,那么.id值1和1都将映射到1,这将导致在awk中使用>时数据丢失

因此,这里有一个解决方案,说明了如何在OS X或*ix环境中实现安全性,并为Windows提供了一个安全解决方案:

jq -c '.[]
       | (.id | if type == "number" then .
                else tostring | gsub("[^A-Za-z0-9-_]";"+") end), .' |
awk '
  function fn(s) { sub(/^\"/,"",s); sub(/\"$/,"",s); return s ".json"; }
  NR%2{f=fn($0); next} 
  {print >> f; close(f);}
' 

请特别注意使用>>以避免在文件名冲突的情况下丢失数据。

由于问题描述表明输入数组很大,因此可能值得考虑使用jq的流式解析器。一般来说,如果输入JSON太大而无法读入内存,或者如果减少计算机内存需求是一个重要目标,那么这将是合适的

简言之,我们没有以正常方式调用jq,而是添加了-n和-stream命令行选项,并将初始的。[]替换为:


然后可以按照本页其他地方所述处理拆分。

因为问题描述表明输入数组很大,所以可能值得考虑使用jq的流式解析器。一般来说,如果输入JSON太大而无法读入内存,或者如果减少计算机内存需求是一个重要目标,那么这将是合适的

简言之,我们没有以正常方式调用jq,而是添加了-n和-stream命令行选项,并将初始的。[]替换为:


然后,可以按照本页其他地方所述处理拆分。

OP没有使用-r命令行选项,使用它可能会带来与嵌入换行符的字符串有关的潜在风险,应该提到这一点。如果已知正在打印的JSON实体不是JSON字符串,那么使用-r是毫无意义的,因此总体而言,最好省略它,除非可以确定它确实是必要的。@peak是的,你有一点,但是如果我们删除-r,我们应该删除awk脚本中的双引号,对我来说这听起来不是一个好主意:/如果数组元素有一个键,它就保证是一个对象,-r不会改变它,对吗?是的,但在OP描述的特定情况下,.id可能包含一个换行符。哦,是的,那将是一个麻烦OP没有使用-r命令行选项,使用它会带来一个潜在的风险,这与应该提到的嵌入换行符的字符串有关。如果已知正在打印的JSON实体不是JSON字符串,那么使用-r是毫无意义的,因此总体而言,最好省略它,除非可以确定它确实是必要的。@peak是的,你有一点,但是如果我们删除-r,我们应该删除awk脚本中的双引号,对我来说这听起来不是个好主意:/如果数组元素有一个键,它就保证是一个对象,-r不会改变它,对吗?是的,但在OP描述的特定情况下,风险是.id可能包含一个换行符。哦,是的,那将是一个麻烦