ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 jq -n 配合 input 和 inputs 读取并聚合多个 JSON 输入

如何用 jq -n 配合 input 和 inputs 读取并聚合多个 JSON 输入 如何用 jq -n 配合 input 和 inputs 读取并聚合多个 JSON 输入【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq当你有多个 JSON 值来自管道、标准输入或命令行上指定的多个文件需要汇总成一个结果——求和、合并成数组、或把多个对象归并成一个对象——默认的 jq 行为不适合这个任务jq 会把输入解析为「以空白分隔的 JSON 值序列」并为每个值独立地运行一次过滤表达式输出按换行分隔的 JSON 写到标准输出。官方手册docs/content/manual/dev/manual.yml 的 I/O 一节为此提供了两个内建函数input和inputs并说明它们「通常配合 null input 选项-n使用以避免某个输入被隐式读取」。本文基于仓库内手册与教程内容说明如何用这三者组合完成「读取并聚合多个 JSON 输入」这一个任务。开始前只需确认本机已有 jq运行jq -V可查看版本--version/-V选项文档注明会输出版本号并以 0 退出。仓库 README.md 给出的获取方式包括下载预编译二进制、拉取 Docker 镜像文档示例docker run -i --rm ghcr.io/jqlang/jq -n range(3)或按 README 的「Building from source」流程源码构建。先理解默认读取模型才能判断为什么需要-n手册「Invoking jq」一节的原文语义是输入被解析为空白分隔的 JSON 值序列逐个传入过滤表达式最简单的过滤表达式.是恒等操作把输入复制到输出流过滤表达式的输出作为换行分隔的 JSON 序列写到标准输出。在这个模型下如果不加-njq 会先「隐式」消费第一个输入作为.你写的表达式再想从同一批输入里取值第一个值就已经被拿走了。手册在input和inputs两条目中都重复了这一点使用input/inputs时「通常必须用-n调用 jq否则第一个实体会丢失」(generally necessary to invoke jq with the-ncommand-line option, otherwise the first entity will be lost)。-n即--null-input手册的定义是「完全不读取任何输入。过滤表达式以null为输入只运行一次」。此时所有真正的输入数据都改由input/inputs在表达式内部显式读取。input和inputs与 jq 自身的读取动作读自相同来源stdin或命令行上指定的文件并且可以与 jq 自身的读取动作交错进行——这正是手册 I/O 一节的原话。用input逐个读取输入成对处理手册对input的定义是「Outputs one new input」输出一个新输入。手册给出的文档示例是不加-n的交错用法echo 1 2 3 4 | jq [., input] # [1,2] [3,4]上面的注释# [1,2] [3,4]是手册标注的文档示例输出jq 按输入逐次运行过滤表达式第一次运行取.值为 1和下一个输入 2第二次运行取 3 和 4。这个例子展示了「当前输入 紧跟其后的一个输入」的成对读取模式。如果你的任务是把输入两两配对例如第一个文件是配置、第二个是数据这就是input的典型位置当前.是第一个输入input读取紧随其后的那个输入。文档同时提醒如果你希望从「什么都不读」的状态开始、完全由表达式控制读取时机就用-n再配合input按需取。用inputs和reduce聚合全部剩余输入inputs的手册定义是「Outputs all remaining inputs, one by one」逐个输出所有剩余输入并且「主要用于对程序的输入做归约reductions」。手册给出的文档示例是echo 1 2 3 | jq -n reduce inputs as $i (0; . $i) # 6# 6是手册标注的文档示例输出。这条命令展示了标题任务的最短主路径-n让程序从null开始不隐式吞掉第一个输入inputs把 1、2、3 逐个输出reduce把它们累加为一个值。reduce的语法手册写在「reduce」条目下形式是reduce EXP as $var (INIT; UPDATE)即把表达式产出的所有结果累加进一个最终答案手册示例reduce .[] as $item (0; . $item)对输入[1,2,3,4,5]的文档示例输出为15。把累加对象从「数组元素.[]」换成「流式输入inputs」就是上面求和命令的形态。同样的模式可以用于归并多个对象。手册reduce条目的文档示例是echo [{x:a,y:1},{x:b,y:2},{x:c,y:3}] \ | jq reduce .[] as {$x,$y} (null; .x $x | .y [$y])文档示例输出为{x:abc,y:[1,2,3]}。把.[]换成inputs即可对多个独立输入值而不是单个数组里的元素做同样的归并echo {x:a,y:1} {x:b,y:2} {x:c,y:3} \ | jq -n reduce inputs as {$x,$y} (null; .x $x | .y [$y])这一条是把手册中reduce的对象归并写法应用到inputs上输入与手册示例相同的三个对象时产出同样是单个合并后的对象。聚合多个输入文件时同理input/inputs与 jq 本身读自相同来源包括命令行上指定的文件因此文件名直接放在程序之后即可jq -n reduce inputs as $i (0; . $i) a.json b.json其中a.json、b.json是你要聚合的文件需替换为你自己的文件名每个文件里可以包含多个 JSON 值inputs会按值逐个输出。把所有输入收集为一个数组如果不需要累加计算、只需要把所有输入值收进一个数组可以组合两个手册已说明的特性inputs逐个输出所有剩余输入而把表达式包在方括号里会收集它产出的全部结果仓库教程 docs/content/tutorial/default.yml 中「collect all of the answers by wrapping the filter in square brackets」一节演示了这种收集方式echo 1 2 3 | jq -n [inputs]按文档行为该命令的输出是把 1、2、3 收集成的数组[1,2,3]。这是由「inputs逐个输出剩余输入」和「方括号收集」两条文档结论推出的结果手册没有直接给出这条完整命令。替代路径-s一次性读完整个输入流如果目标只是「把整个输入流当成一个大数组处理」手册的--slurp/-s选项提供了替代路径「不再对输入中的每个 JSON 对象运行过滤表达式而是把整个输入流读入一个大数组过滤表达式只运行一次」。此时不需要-n也不需要手写reduceecho 1 2 3 | jq -s .[1]-s适合「整批一次性处理」的场景-n配合input/inputs适合需要显式控制「何时读取、读取几个」的场景例如成对读取、或先读配置再读数据。两种路径读的是同一批输入选择取决于你的过滤逻辑而不是性能。验证与限制验证方式按手册给出的行为逐项对照程序输出「总是作为 JSON 文本写到stdout」所以聚合结果可以直接看到示例命令的成功条件就是输出等于手册标注的文档示例值如求和示例的6。退出状态手册--exit-status/-e条目说明jq 默认在程序运行时以 0 退出加-e后最后一个输出值既不是false也不是null时退出码为 0是false或null时为 1从未产生有效结果时为 4。用它判断「聚合是否产出了结果」比肉眼更可靠。jq -V能正常输出版本号说明工具链本身可用。需要注意的边界均来自手册原文手册 I/O 一节指出大多数 jq 内建函数是引用透明的对恒定输入产生恒定且可重复的值流「I/O 内建函数不是」This is not true of I/O builtins。因此含input/inputs的表达式输出取决于输入流的实际内容不能当作纯函数缓存或推理。忘记-n的后果文档已明说第一个输入被隐式读走、丢失。如果你发现聚合结果「少了第一个值」先检查是否漏了-n。Shell 引用规则手册建议 Unix shell 下始终用单引号包裹 jq 程序Windows cmd.exe 用双引号并对内部双引号加反斜杠PowerShell 用单引号加\转义因为 jq 程序中大量字符同时是 shell 元字符。版本范围-n/--null-input在仓库内各版本手册v1.3 起中都有记载input/inputs从 v1.5 的手册开始出现见 docs/content/manual/v1.5/manual.yml 的 I/O 一节v1.6、v1.8 与 dev 手册内容一致。input_filename内建可以返回「当前正在被过滤的输入来自哪个文件」手册提醒它在非 UTF-8 locale 下不能正常工作需要区分多文件输入来源时可用它。更多细节可继续查仓库内的 I/O 手册章节input、inputs、debug、stderr、input_filename条目与 reduce 条目归约语法与文档示例。【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表