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

