如何用jq将multiqc_data.json的指定统计数据转为TSV?
正确提取MultiQC统计数据为TSV的jq方案
你的问题出在直接对report_general_stats_data[1]使用@tsv——这个元素是嵌套结构(包含表头定义、样本行数据等),并非扁平化的样本统计集合,所以输出不符合预期。以下是针对不同场景的解决方法:
场景1:已知目标统计组的索引(比如你之前用的[1])
如果确定report_general_stats_data[1]是包含目标字段的统计组,用以下命令提取指定字段并生成标准TSV:
jq -r ' # 定义输出表头和要提取的字段 ["sample_id", "filtering_result_passed_filter_reads", "pct_adapter"] as $headers # 先输出表头行 | $headers | @tsv # 遍历样本数据,提取对应字段并拼接内容 | . + "\n" + (.report_general_stats_data[1].rows | to_entries[] | [.key, .value.filtering_result_passed_filter_reads, .value.pct_adapter] | @tsv) ' multiqc_data.json > multiqc_data.tsv
场景2:不确定统计组索引,按字段自动匹配
如果不知道目标字段在哪个统计组里,可通过字段存在性自动定位,命令如下:
jq -r ' ["sample_id", "filtering_result_passed_filter_reads", "pct_adapter"] as $headers | $headers | @tsv | . + "\n" + (.report_general_stats_data[] # 筛选包含目标字段的统计组 | select(.rows | any(.[] | has("filtering_result_passed_filter_reads") and has("pct_adapter"))) # 遍历每个样本的统计数据 | .rows | to_entries[] | [.key, .value.filtering_result_passed_filter_reads, .value.pct_adapter] | @tsv) ' multiqc_data.json > multiqc_data.tsv
注意事项
- 如果JSON中的字段名和示例有差异(比如大小写、前缀不同),需修改命令中对应的字段名。可先用
jq '.report_general_stats_data[1].rows | .[]' multiqc_data.json查看样本的完整字段列表。 - 如需提取更多字段,只需在
$headers数组和后续的[]中添加对应的字段名即可。
内容的提问来源于stack exchange,提问作者amolares
相关产品推荐
相关产品推荐

