如何将Nextflow流程输出合并为单个文件?collectFile使用未生效
问题原因
你的脚本问题出在collectFile的使用和concatenation流程的脚本逻辑上:
collectFile会将headers输出的所有文件收集到一个临时目录中,并把这个目录路径传给concatenation流程- 但你在
concatenation的脚本里写的是cat ${tsv},这里的${tsv}是目录路径,而非目录下的所有目标文件,导致实际未执行多文件合并操作,最终只生成了不符合预期的结果。
修复方案
以下两种方式任选其一即可解决问题:
方式一:修改concatenation流程的脚本逻辑
保留collectFile,但明确遍历收集目录下的所有目标文件进行合并:
//concatinating sorted blastn files into a single file process concatenation { publishDir "${params.outdir}/results", mode:'copy' input: path tsv_dir // 明确接收目录路径 output: path "concatenatedHits.tsv" script: """ cat ${tsv_dir}/*_blast_sort_withHeader.tsv > concatenatedHits.tsv """ }
方式二:移除collectFile,直接收集所有文件路径
改用collect将所有文件路径收集为一个列表,直接传给concatenation流程进行合并:
//workflow definition workflow { Channel.fromPath( params.in ) \ | headers \ | collect \ // 收集所有文件路径到一个列表 | concatenation } // 修改concatenation流程的输入定义 process concatenation { publishDir "${params.outdir}/results", mode:'copy' input: path tsv_files // 接收文件路径列表 output: path "concatenatedHits.tsv" script: """ cat ${tsv_files} > concatenatedHits.tsv """ }
额外优化建议
合并后的文件会包含多个重复表头(每个输入文件都添加了表头),如果需要仅保留一份表头,可以修改合并逻辑:
# 先写入第一个文件的表头 head -n 1 ${tsv_files[0]} > concatenatedHits.tsv # 追加所有文件的内容(跳过各自的表头行) for file in ${tsv_files}; do tail -n +2 ${file} >> concatenatedHits.tsv done
内容的提问来源于stack exchange,提问作者Asad Prodhan
相关产品推荐
相关产品推荐

