arrays - 如何使用 jq 将数组拆分为多个 block ?

标签 arrays json shell jq memory-efficient

我有一个非常大的 JSON 文件,其中包含一个数组。是否可以使用 jq将此数组拆分为几个固定大小的较小数组?假设我的输入是这样的:[1,2,3,4,5,6,7,8,9,10] ,我想把它分成 3 个元素长的块。来自 jq 的期望输出将是:

[1,2,3]
[4,5,6]
[7,8,9]
[10]

实际上,我的输入数组有将近三百万个元素,都是 UUID。

最佳答案

有一个(未记录的)内置函数,_nwise ,满足功能要求:

$ jq -nc '[1,2,3,4,5,6,7,8,9,10] | _nwise(3)'

[1,2,3]
[4,5,6]
[7,8,9]
[10]

还:
$ jq -nc '_nwise([1,2,3,4,5,6,7,8,9,10];3)' 
[1,2,3]
[4,5,6]
[7,8,9]
[10]

顺便说一句,_nwise可用于数组和字符串。

(我认为它没有记录,因为对合适的名称存在一些疑问。)

TCO-版本

不幸的是,内置版本是粗心定义的,对于大型数组不会有很好的表现。这是一个优化版本(它应该与非递归版本一样高效):
def nwise($n):
 def _nwise:
   if length <= $n then . else .[0:$n] , (.[$n:]|_nwise) end;
 _nwise;

对于大小为 300 万的数组,这是非常高效的:
在旧 Mac 上为 3.91 秒,最大驻留大小为 162746368。

请注意,此版本(使用尾调用优化递归)实际上比 nwise/2 的版本更快使用 foreach显示在本页的其他地方。

关于arrays - 如何使用 jq 将数组拆分为多个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51412721/

相关文章:

c++ - 字符串数组长度 C++ 问题?

objective-c - 在 Mac 应用程序和 Web 之间同步 'lot' 小块数据的最佳方法是什么?

Android JSON 对象丢失了 URL 中的剩余数据

bash - 使用 Shell 脚本自动将 .tar 文件提取到当前目录

shell - 使用 Linux Mailx 发送简单的消息正文 + 文件附件

javascript - VBScript 匿名关联数组? (就像 JavaScript 中一样)

c 字符访问冲突错误

c - 连续调用同一数组时出现奇怪的段错误

javascript - 将具有相同名称的输入的表单转换为 JSON

shell - su -c 的 ANT SSHEXEC 密码提示问题