如何使用jq处理NDJSON数据并输出指定格式的结果?
问题
我有如下NDJSON数据:
{"id": "one", "colors": [{"color": "blue"}, {"color": "red"}]} {"id": "two", "colors": [{"color": "green"}]}
想要得到如下输出:
one blue one red two green
以下是两次失败的尝试:
尝试1
$ cat tmp/test.json | jq -r '.id, .colors[].color'
输出:
one blue red two green
尝试2
$ cat tmp/test.json | jq -r '[.id, .colors[].color]|@tsv'
输出:
one blue red two green
解决方案
用下面任意一个jq命令就能得到想要的结果:
方法一:通过变量保存当前对象
cat tmp/test.json | jq -r '. as $obj | .colors[] | "\($obj.id) \(.color)"'
方法二:向上遍历获取父级ID
cat tmp/test.json | jq -r '.colors[] | [../.id, .color] | @tsv'
为啥之前的尝试不对?
- 尝试1用
,分隔输出字段,会把id和所有color拆成独立的行,没法建立id和单个color的对应关系; - 尝试2把id和所有color放到同一个数组里转TSV,导致一个id带着多个color出现在同一行,不符合需求。
正确逻辑说明
核心是要让每个colors数组里的颜色项,都能关联到它所属的id:
- 方法一先把当前整个JSON对象存到变量
$obj里,遍历colors时直接从变量里取id,再和当前颜色拼接成一行; - 方法二遍历
colors的每个元素时,用../.id向上找到父级对象的id,再把id和color组成数组转成TSV输出。
内容的提问来源于stack exchange,提问作者dfrankow
相关产品推荐
相关产品推荐

