Bash新手求助:如何批量对文件夹内fq文件执行BBMap reformat.sh命令
批量执行BBMap reformat.sh处理双端测序文件的正确Bash写法
原命令的问题
你原来的循环会遍历目标文件夹下的所有文件,导致$samples被赋值为每个完整文件名(比如XY1.1.fq),拼接后会生成错误的输入路径(比如XY1.1.fq.1.fq),完全不符合需求。
正确写法(通用版)
直接遍历所有.1.fq结尾的文件,提取样本前缀后匹配对应的.2.fq文件,自动生成符合要求的输出文件名:
# 先切换到目标目录,简化路径书写 cd ~/work/RADseq/Pool1_process_radtags/ # 遍历所有以.1.fq结尾的文件 for read1 in *.1.fq; do # 提取样本名(去掉.1.fq后缀) sample=$(basename "$read1" .1.fq) # 构造对应的read2文件路径 read2="${sample}.2.fq" # 构造输出文件名,匹配示例格式 out1="${sample}.1-reform.fq" out2="${sample}.2-reform.fq" # 执行BBMap的reformat.sh命令 /usr/local/bioinfo/src/BBMap/bbmap_38.95/reformat.sh in="$read1" in2="$read2" out="$out1" out2="$out2" addslash=true done
固定样本名单的写法(适合已知所有样本名的场景)
如果已经明确知道所有样本前缀,也可以直接遍历样本名列表:
cd ~/work/RADseq/Pool1_process_radtags/ for sample in XY1 XY2 XY15 XY18; do /usr/local/bioinfo/src/BBMap/bbmap_38.95/reformat.sh in="${sample}.1.fq" in2="${sample}.2.fq" out="${sample}.1-reform.fq" out2="${sample}.2-reform.fq" addslash=true done
关键说明
- 用
basename "$read1" .1.fq可以安全地提取样本前缀,即使文件名包含特殊字符也能处理 - 给变量加双引号(比如
in="$read1")可以避免文件名含空格或特殊字符时出现错误
内容的提问来源于stack exchange,提问作者Loïs V
相关产品推荐
相关产品推荐

