如何用JQ将JSON中基因与通路数据展开为制表符分隔行
用JQ实现基因通路的TSV展开输出
当然可以用jq搞定这个需求!这刚好是jq最擅长的JSON数据拆分场景,我给你一步步拆解具体实现方法:
先明确输入JSON结构(假设你的数据格式如下)
首先我先模拟一下你提到的简化JSON数组结构,方便后续演示:
[ { "genes_id": "b0001", "pathways": ["Glycolysis/Gluconeogenesis", "Pentose Phosphate Pathway"] }, { "genes_id": "b0002", "pathways": ["Citrate Cycle (TCA Cycle)"] } ]
核心JQ命令
直接用这条命令就能生成你要的制表符分隔文件:
jq -r '.[] | .genes_id as $id | .pathways[] | [$id, .] | @tsv' input.json > output.tsv
命令各部分解释
-r:开启原始输出模式,避免给字符串加多余的JSON引号,生成干净的TSV内容.[]:遍历JSON数组中的每一个基因对象.genes_id as $id:把当前基因的ID存入变量$id,方便后续和每个通路条目绑定.pathways[]:把当前基因的通路列表拆分成单独的条目[$id, .]:将基因ID和单个通路条目组合成一个二元数组@tsv:把二元数组转换成制表符分隔的字符串> output.tsv:将结果输出到指定的TSV文件中
处理特殊情况(可选)
如果你的数据中存在pathways为null或者空数组的基因,可以加个容错处理,避免命令报错:
jq -r '.[] | .genes_id as $id | (.pathways // [])[] | [$id, .] | @tsv' input.json > output.tsv
这里的// []表示:如果pathways不存在或为空,就替换成空数组,这样空通路的基因就不会生成任何行。
最终输出效果
运行命令后,output.tsv的内容会是这样的(制表符分隔):
b0001 Glycolysis/Gluconeogenesis b0001 Pentose Phosphate Pathway b0002 Citrate Cycle (TCA Cycle)
内容的提问来源于stack exchange,提问作者CodeNoob
相关产品推荐
相关产品推荐

