使用Snakemake批量合并样本染色体文件的技术实现问询
批量合并样本染色体文件的实现方案
需求说明
需要对sample1至sample4共4个样本,分别合并每个样本对应的chr1、chrX、chrM三个独立文件,最终生成以下指定路径的合并文件:
result/sample1_merged_chr1XM.txt result/sample2_merged_chr1XM.txt result/sample3_merged_chr1XM.txt result/sample4_merged_chr1XM.txt
手动合并命令示例
(注:原示例存在笔误,已修正为对应样本的chr1文件)
cat dirToFiles/sample1_chr_1_data.txt dirToFiles/sample1_chr_X_data.txt dirToFiles/sample1_chr_M_data.txt > result/sample1_merged.txt cat dirToFiles/sample2_chr_1_data.txt dirToFiles/sample2_chr_X_data.txt dirToFiles/sample2_chr_M_data.txt > result/sample2_merged.txt cat dirToFiles/sample3_chr_1_data.txt dirToFiles/sample3_chr_X_data.txt dirToFiles/sample3_chr_M_data.txt > result/sample3_merged.txt cat dirToFiles/sample4_chr_1_data.txt dirToFiles/sample4_chr_X_data.txt dirToFiles/sample4_chr_M_data.txt > result/sample4_merged.txt
可复现代码(生成测试文件+Snakemake规则)
步骤1:生成待合并的测试文件
用于创建模拟的样本染色体文件,方便验证合并逻辑:
####################################### #Step 1: 创建待合并的多个文件 ###################################### import subprocess subprocess.run((['mkdir','-p', 'dirToFiles'])) SAMPLES = ["sample1", "sample2", "sample3", "sample4"] CHROMS=["1", "X", "M"] for sample in SAMPLES: for chrom in CHROMS: subprocess.run((['touch', f'dirToFiles/{sample}_chr_{chrom}_data.txt'])) # 原代码中这条echo命令写法有误,无法正常写入内容,已注释 for sample in SAMPLES: for chrom in CHROMS: f = open(f'dirToFiles/{sample}_chr_{chrom}_data.txt', "w") f.write(f'dirToFiles/{sample}_chr_{chrom}_data.txt') f.close() # 也可使用Snakemake的expand语法批量生成文件路径: # expand("dirToFiles/{sample}_chr_{chrom}_data.txt", sample=SAMPLES, chrom=CHROMS)
步骤2:Snakemake规则编写
通过Snakemake实现批量自动化合并:
################################# #Step 2: Snakemake 规则 ################################# SAMPLES = ["sample1", "sample2", "sample3", "sample4"] CHROMS = ["1", "X", "M"] rule all: input: expand("result/{sample}_merged_chr1XM.txt", sample=SAMPLES) rule combineFiles: input: expand("dirToFiles/{sample}_chr_{chrom}_data.txt", chrom=CHROMS, partial=True) output: "result/{sample}_merged_chr1XM.txt" log: "logs/{sample}_merged_chr1XM.txt" shell: """ cat {input} > {output} &> {log} """
内容的提问来源于stack exchange,提问作者sahuno
相关产品推荐
相关产品推荐

