arrays - 如何使用 jq 将数组拆分为块?
问题描述
我有一个非常大的 JSON 文件,其中包含一个数组。是否可以jq
将此数组拆分为几个固定大小的较小数组?假设我的输入是这样的:[1,2,3,4,5,6,7,8,9,10]
,我想把它分成 3 个元素的长块。所需的输出jq
将是:
[1,2,3]
[4,5,6]
[7,8,9]
[10]
实际上,我的输入数组有近 300 万个元素,都是 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.91s,最大驻留大小为 162746368。
请注意,此版本(使用尾调用优化递归)实际上比本页其他地方显示的nwise/2
using版本更快。foreach
推荐阅读
- amazon-web-services - AWS Root 用户无法通过控制台或 aws-sdk 创建 lambda 函数
- twilio - 我已经集成了 twilio otp api,它突然停止工作
- python-3.x - Cog 命令重复消息(Discord.py 重写)
- sql - Oracle SQL 开始于/之前
- javascript - 如何在 Visual Studio 代码上将 Javascript 代码混合/添加到 Html 代码?
- c - 如何使在 Linux 上编写的适用于 Windows 的 C 可执行文件在完成运行后不会立即关闭 cmd?
- reactjs - 将数据从一个组件传递到另一个组件时,表单验证不起作用
- linux - logrotate.conf 所以我只需要截断这个文件而不用 * 使用日期函数它不起作用
- python - Pandas:按时钟时间计算平均值和标准差
- javascript - JavaScript 获取所选项目的 TextContent