用 jq --slurpfile 按共享 ID 将两个 JSON 文件拉链合并成一份
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载本文讲解如何在 TIL 开源仓库所收录的 jq 实战笔记基础上用一条jq单行命令把两份共享同一标识如slug的 JSON 文件拉链式合并成一份完整数据文件一提供主体记录文件二补充关联字段最终按共享 ID 拼接输出。读完本文你将掌握--slurpfile的参数语义、select过滤与对象并集运算符的组合用法并能直接把它复用到书籍元数据、配置合并、接口联表等真实场景。场景两份 JSON 文件一个共享标识假设我们有两份 JSON 文件。list1.json是一个对象数组记录了一些书籍的基础元数据比如slug唯一标识和title[ { slug: the-subtle-knife, title: The Subtle Knife }, { slug: all-systems-red, title: All Systems Red }, { slug: piranesi-abc123, title: Piranesi } ]list2.json的格式与之类似但每个对象携带的是另一块与slug绑定的补充元数据例如作者信息[ { slug: the-subtle-knife, author: Philip Pullman }, { slug: all-systems-red, author: Martha Wells }, { slug: piranesi-abc123, author: Susanna Clarke } ]目标很明确以slug为连接键把第二份文件里的字段合并进第一份文件形成一条条完整的记录。这个需求本质上是数据联表join。如果数据量不大与其手工复制粘贴大量字段或者为一个临时任务专门写一个完整脚本不如直接用jq的一条命令搞定——核心工具就是--slurpfile参数见 jq/zip-two-json-files-together-based-on-shared-id.md。一条命令完成拉链合并原文档给出的方案是一个jq单行命令同时传入两个文件名并通过--slurpfile把它们各自读入一个命名变量jq --slurpfile list1 list1.json --slurpfile list2 list2.json -n $list1[] as $item1 | $list2[] as $item2 | select($item1.slug $item2.slug) | $item1 $item2 运行后输出大致如下每条记录同时带上了标题和作者[ { slug: the-subtle-knife, title: The Subtle Knife, author: Philip Pullman }, { slug: all-systems-red, title: All Systems Red, author: Martha Wells }, { slug: piranesi-abc123, title: Piranesi, author: Susanna Clarke } ]为便于阅读示例中 JSON 字符串使用单引号简化书写实际 JSON 文件中请按标准使用双引号。拆解命令的每一部分这条命令虽然短但每个环节都值得逐行理解方便举一反三。--slurpfile把整个文件读成数组并绑定到命名变量--slurpfile list1 list1.json的意思是读取list1.json的全部内容slurp 的含义就是一次性吞下整个输入把它解析成一个 JSON 数组并绑定到变量名list1。命令中出现了两次--slurpfile list1 list1.json --slurpfile list2 list2.json于是过滤器内部可以直接用$list1、$list2引用这两个数组。这与 TIL 仓库中另一篇笔记 jq/turn-a-list-from-a-command-into-json.md 讲到的-s / --slurp是同一族概念--slurp把标准输入的整个内容读成数组而--slurpfile更进一步把指定文件的内容读成数组并赋给命名变量。因为这里有两个来源命名变量是唯一能区分它们的方式。-n不读取标准输入只执行过滤器-n是--null-input的缩写。加上它之后jq不会去读标准输入或额外的输入文件而是直接把null当作输入、执行一次过滤器。这样整个过滤器完全依赖$list1、$list2两个变量不会有无关输入干扰结果。$list1[] as $item1遍历数组中的每个元素$list1[]会把数组中的每个元素依次作为输出流的一个值as $item1则把当前元素绑定到变量$item1。配合管道$list1[] as $item1 | $list2[] as $item2实际上构成了一个嵌套循环外层遍历list1的每个对象内层遍历list2的每个对象从而产生两份数据的全部两两组合笛卡尔积。select(...)只保留匹配的组合select($item1.slug $item2.slug)是一个过滤条件只有当内层循环里的$item2与当前$item1的slug相等时该组合才会继续流向下一步。这一步把笛卡尔积压缩成了真正匹配上的配对等价于关系数据库中的 join 谓词。select是 jq 中最常用的过滤手段之一仓库中的 jq/find-all-objects-with-a-matching-key-value-pair.md 展示了它在数组映射场景中的更多用法例如配合map找出所有status reading的书籍可以作为进阶参考。$item1 $item2对象并集union这是合并真正发生的地方。在 jq 中作用于两个对象时执行的是字段并集两个对象的全部字段都会保留若存在同名字段右侧对象$item2的取值覆盖左侧$item1。于是$item1的slug、title与$item2的slug、author合并成一个新对象。这里slug在两份数据中取值相同覆盖后值不变可以放心让并集自然处理但如果两份数据在同一字段上存在差异就必须注意右操作数的优先级。管道|的语义jq 的|与 shell 管道类似但处理对象是数据流上一步产出的每个值都会作为下一步的输入被依次处理。四个步骤串联起来等价于遍历所有 (item1, item2) 组合 → 筛选出 slug 相等的组合 → 输出合并后的对象输出会逐条打到标准输出多条输出之间用换行分隔整体看起来就是拉链合并后的记录列表。实操复现从零跑通并落盘下面给出可以直接复制运行的完整示例。首先创建两份标准 JSON 文件cat list1.json EOF [ { slug: the-subtle-knife, title: The Subtle Knife }, { slug: all-systems-red, title: All Systems Red }, { slug: piranesi-abc123, title: Piranesi } ] EOF cat list2.json EOF [ { slug: the-subtle-knife, author: Philip Pullman }, { slug: all-systems-red, author: Martha Wells }, { slug: piranesi-abc123, author: Susanna Clarke } ] EOF然后运行合并命令。默认情况下结果输出到标准输出可以直接查看jq --slurpfile list1 list1.json --slurpfile list2 list2.json -n $list1[] as $item1 | $list2[] as $item2 | select($item1.slug $item2.slug) | $item1 $item2 如果想保存成新的 JSON 文件把标准输出重定向即可原文件保持不变jq --slurpfile list1 list1.json --slurpfile list2 list2.json -n $list1[] as $item1 | $list2[] as $item2 | select($item1.slug $item2.slug) | $item1 $item2 merged.json之后可以用jq顺手验证合并结果比如统计条数参考 jq/count-the-number-of-things-in-a-json-file.md 的length用法jq length merged.json边界情况与进阶思路在实际数据上应用这个模式前有几个行为值得提前了解无匹配的组合会被静默丢弃select直接过滤掉slug不相等的组合因此孤儿记录只在其中一份文件中出现的slug不会出现在输出里。如果希望保留未匹配记录并填充空值需要改用其他结构如以list1为基准遍历再在list2中查找。重复的slug会产生多条输出由于实现是两两组合 条件过滤任何一边出现重复slug时匹配到的每一对组合都会各输出一行。合并前最好先确认slug在各自文件中是唯一的。字段冲突时右操作数获胜$item1 $item2中同名键以$item2为准。若想让list1的字段优先把加法顺序调成$item2 $item1即可。大文件注意复杂度上述写法本质是嵌套循环两两比较的代价约为 O(n × m)。若两份数据规模都很大jq手册中还提供了面向哈希查找的INDEX/JOIN等内置函数适合作为进阶替代方案。相关参考本主题位于 TIL 仓库的 jq 分类下关联文档为 jq/zip-two-json-files-together-based-on-shared-id.md。同分类下的这些笔记可与本文互相印证jq/turn-a-list-from-a-command-into-json.md讲解-s / --slurp读入整个输入与--slurpfile同源jq/find-all-objects-with-a-matching-key-value-pair.mdselect过滤条件的更多实战组合jq/combine-an-array-of-objects-into-a-single-object.mdadd把对象数组合并成单个对象可作为合并结果再加工的手段jq/count-the-number-of-things-in-a-json-file.md用length验证合并后的记录数量。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐如何用 jq -n 配合 input 和 inputs 读取并聚合多个 JSON 输入如何用 jq n 配合 input 和 inputs 读取并聚合多个 JSON 输入 当你有多个 JSON 值来自管道、标准输入或命令行上指定的多个文件需CLI数据分析Rerun C 多进程共享录制实战用 RecordingId 将多次进程运行合并到同一份录制Rerun C 多进程共享录制实战用 RecordingId 将多次进程运行合并到同一份录制 导读 本文讲解 Rerun C SDK 中 Record数据可视化3D渲染数据分析jsPDF终极文档合并指南5个高效技巧将多个PDF文件合并为一个jsPDF终极文档合并指南5个高效技巧将多个PDF文件合并为一个 想要轻松实现PDF文档合并jsPDF作为强大的JavaScript PDF生成库提供了多后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

深入浅出C++ STL:stack/queue容器适配器底层实现与算法实战

深入浅出C++ STL:stack/queue容器适配器底层实现与算法实战

stack 和 queue 这两个东西,看起来是 STL 里最“没技术含量”的容器:一个后进先出,一个先进先出,接口加起来不到十个。但真要在面试或工程项目里把它讲清楚、用得对,很多人都会卡壳——为什么 stack 的默认底层是 dequ…

2026/10/19 23:25:48 阅读更多 →
EdgeQuake文档摄取完全手册:上传、进度监控、取消重试与最常见问题排查

EdgeQuake文档摄取完全手册:上传、进度监控、取消重试与最常见问题排查

EdgeQuake文档摄取完全手册:上传、进度监控、取消重试与最常见问题排查 【免费下载链接】edgequake EdegQuake 🌋 High-performance GraphRAG inspired from LightRag written in Rust; Transform documents into intelligent knowledge graphs for supe…

2026/10/19 13:31:05 阅读更多 →
Agent-Reach:面向业务落地的智能体抵达协议

Agent-Reach:面向业务落地的智能体抵达协议

1. 项目概述:Agent-Reach 是什么,它解决的不是“调用API”而是“让智能体真正抵达业务现场”Agent-Reach 这个名字里,“Agent”不是指某个具体模型或服务,而是泛指具备目标理解、工具调用、状态记忆与自主决策能力的智能体&#x…

2026/10/20 12:29:58 阅读更多 →

最新新闻

diagram-design:系统可视化设计的方法论与工程实践

diagram-design:系统可视化设计的方法论与工程实践

1. “diagram-design”不是一张图,而是一套系统性视觉表达方法论很多人第一次看到“diagram-design”这个词,下意识会把它当成“画流程图”“做PPT示意图”或者“用draw.io拖几个框连几条线”的简单操作。我最初也这么想——直到在某高校的跨学科课程设计…

2026/10/20 23:24:57 阅读更多 →
CTF实战套路:从信息收集到Shell提权的骚操作全解析

CTF实战套路:从信息收集到Shell提权的骚操作全解析

CTF里总有那么一类题,你说它难吧,考点可能一点都不深;你说它简单吧,比赛现场就是想不到。这篇文章想聊的,就是这些被老手们称作“骚操作”的常见套路——它们不一定在每场比赛里都会出现,可一旦出现&#x…

2026/10/20 23:24:57 阅读更多 →
《SHIT》期刊收稿全解析:投稿前必须明白的四个选题方向

《SHIT》期刊收稿全解析:投稿前必须明白的四个选题方向

最近收到好几个朋友的私信,都在问同一个事:《SHIT》这本期刊到底收什么稿子,是不是真的什么“垃圾”都收,投了快两个月也没回音,是编辑没看到还是稿子本身出了问题。我干脆把知道的情况和个人投稿经验整理成一篇&#…

2026/10/20 23:24:57 阅读更多 →
从零构建活期储蓄账目管理系统:Flask+SQLite实战指南

从零构建活期储蓄账目管理系统:Flask+SQLite实战指南

1. 从需求出发:为什么我会做这个活期储蓄账目管理系统先说个背景。我一直有记账的习惯,但记账软件换了好几款,总感觉差点意思——要么太重,理财、基金、股票全塞在一个App里,天天给你推送算法推荐;要么太轻…

2026/10/20 23:24:57 阅读更多 →
Flink多流合并算子详解:UNION、CONNECT、CoGroup与JOIN的选型与实战

Flink多流合并算子详解:UNION、CONNECT、CoGroup与JOIN的选型与实战

写了几年Flink作业,发现好多人在多流处理这块还是凭感觉选API。订单流来了,支付流来了,库存流来了,想都没想就union()一把梭,跑出来的数据对不上账,只能半夜爬起来看日志。其实Flink的多流合并算子不是简单…

2026/10/20 23:24:57 阅读更多 →
人机协同学术写作:从白屏恐惧到全流程提效的完整指南

人机协同学术写作:从白屏恐惧到全流程提效的完整指南

最近总有人问我:“你写论文是不是也用AI?”我的回答很统一:用,但不是你们想的那种用法。我不是把题目扔给AI让它替我写,而是把它当成一个特别能加班、特别能抬杠、特别擅长把一句废话扩成三页纸的写作搭子。真正的学术…

2026/10/20 23:23:57 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →