You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jq将嵌套NDJSON数据集展平为制表符分隔格式?

问题:用jq将嵌套NDJSON转换为扁平制表符分隔格式

输入示例

有如下NDJSON文件内容:

{"id": 99, "labeled_values": [["one", "green"], ["two", "red"], ["three", "blue"]]}
{"id": 100, "labeled_values": [["four", "green"], ["five", "red"]]}

期望输出

需要得到每行保留id、展平(value, label)对的制表符分隔结果:

99	one	green
99	two	red
99	three	blue
100	four	green
100	five	red

失败的尝试

以下是两次未得到期望结果的尝试:

尝试1

cat tmp/foo.ndjson | jq -r '.id as $id | [$id, .labeled_values.[0], .labeled_values.[1]] '

输出:

[
  99,
  [
    "one",
    "green"
  ],
  [
    "two",
    "red"
  ]
]
[
  100,
  [
    "four",
    "green"
  ],
  [
    "five",
    "red"
  ]
]

尝试2

cat tmp/foo.ndjson | jq -r '.id as $id | [$id, .labeled_values[].[0], .labeled_values[].[1]] '

输出:

[
  99,
  "one",
  "two",
  "three",
  "green",
  "red",
  "blue"
]
[
  100,
  "four",
  "five",
  "green",
  "red"
]

正确的解决方案

使用以下jq命令即可得到期望的输出:

cat tmp/foo.ndjson | jq -r '.id as $id | .labeled_values[] | [$id, .[]] | @tsv'

命令解释

  • .id as $id:将当前JSON对象的id值存入变量$id,后续遍历嵌套数组时可重复引用
  • .labeled_values[]:遍历labeled_values数组中的每一个子数组(即每一组["value", "color"])
  • [$id, .[]]:将$id与当前子数组的所有元素(展开子数组)组合成一维数组
  • @tsv:将一维数组转换为制表符分隔的字符串,-r参数确保输出原始文本而非JSON格式

关于学习jq处理嵌套结构的建议

  1. 掌握核心操作逻辑:重点理解[]的遍历作用(遍历数组元素)和|的管道传递(将前一步结果交给后一步处理),这是拆解嵌套结构的基础
  2. 分步调试:先用jq '.'查看原始结构,再逐步添加过滤规则,每一步都观察输出结果,定位问题
  3. 啃官方文档:jq官方文档的教程和内置函数部分有大量嵌套处理示例,重点关注数组操作、变量绑定、格式化输出(如@tsv、@csv)的内容
  4. 从小案例练起:先处理单个嵌套对象,再扩展到多对象的NDJSON,逐步增加复杂度
  5. 利用调试工具:使用jq 'debug'查看每一步的处理结果,或拆分命令分步执行

内容的提问来源于stack exchange,提问作者dfrankow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:55:19