Bash脚本遍历_1/_2.fastq.gz文件失败,请求排查修复
问题分析与修正方案
原脚本存在的问题
- 循环逻辑错误:遍历所有
.fastq.gz文件后,用find在单个文件路径下搜索配对文件,这完全无效——find用于搜索目录,而非单个文件。 - 变量拼写错误:
samleID是sampleID的笔误,会导致样本名提取失败。 - 样本名处理不当:直接提取文件名会保留
.fastq.gz后缀和_1/_2标识,无法得到干净的样本名。 - 未做文件存在性检查:若某样本缺失R2文件,
salmon命令会直接报错中断循环。
修正后的脚本
fastq_dir="../script" # 遍历所有_1.fastq.gz文件,每个对应一个样本的配对读段1 for r1 in "${fastq_dir}"/*_1.fastq.gz do # 从R1路径推导对应R2的路径 r2="${r1/_1.fastq.gz/_2.fastq.gz}" # 检查R2文件是否存在,不存在则跳过当前样本 if [ ! -f "$r2" ]; then echo "警告:未找到$r1对应的R2文件$r2,跳过该样本" continue fi # 提取干净的样本名:去掉路径和_1.fastq.gz后缀 sample_name=$(basename "$r1" _1.fastq.gz) # 确保输出目录存在(不存在则创建) mkdir -p salmon_quant/"$sample_name" # 执行salmon定量分析 salmon quant -i salmon_index -l A -1 "$r1" -2 "$r2" --validateMappings -o salmon_quant/"$sample_name"/ done
关键修正说明
- 直接遍历
*_1.fastq.gz文件:确保每个循环迭代对应一个完整样本的R1读段,避免重复处理。 - 字符串替换生成R2路径:比
find更高效,且能精准匹配配对文件。 - 添加文件存在性检查:避免因缺失文件导致脚本中断,同时给出明确提示。
- 精准提取样本名:利用
basename的后缀移除功能,直接得到无冗余标识的样本名。 - 预创建输出目录:用
mkdir -p确保salmon有写入目录,避免因目录不存在报错。
内容的提问来源于stack exchange,提问作者Ahmed Salah Hassan
相关产品推荐
相关产品推荐

