Salmon比对RNA-seq时,按文件名选基因组索引的if语句失效求助
解决Salmon脚本条件判断总是走else的问题
这种条件判断失效、死活不走if分支的情况真的太磨人了!我之前写批量处理测序数据的脚本时也踩过好几个坑,咱们一步步来排查和解决:
1. 先检查文件名匹配的语法是否正确
bash里的字符串匹配有讲究,最容易出错的就是条件判断的写法:
- 如果你用的是
[[ ]](推荐,支持通配符和正则),一定要给变量加双引号,比如:
这里的if [[ "$filename" == *C57BL6* ]]; then*是通配符,代表任意字符,能匹配文件名里任意位置出现的C57BL6。 - 要是用
[ ],POSIX标准里不支持==,得换成=,而且同样要加双引号:
不过这种写法在部分shell里需要开启if [ "$filename" = *C57BL6* ]; thenextglob选项(shopt -s extglob)才能正常识别通配符,不如[[ ]]省心。
2. 确认变量是否正确获取了文件名
很多时候问题出在变量上:比如你把文件的完整路径赋值给了变量(比如/data/samples/sample_C57BL6.fastq.gz),而你的匹配条件只盯着文件名里的品系,这时候路径里的字符可能干扰匹配。
解决办法是用basename提取纯文件名:
filename=$(basename "$input_file")
这样不管输入的是完整路径还是相对路径,filename里都只有文件名本身,匹配更准确。
3. 排查大小写或特殊字符问题
有没有可能文件名里的品系是小写(比如c57bl6),但你的条件写的是大写C57BL6?这种情况肯定匹配不上。
- 要么统一文件名和条件的大小写;
- 要么开启bash的忽略大小写匹配:在脚本开头加
shopt -s nocasematch,这样*C57BL6*也能匹配到c57bl6。
4. 检查遍历文件时的空格问题
如果你的文件名里有空格(比如sample C57BL6.fastq.gz),遍历的时候没加双引号会导致变量被拆分成多个部分,匹配自然失效。
比如错误的遍历写法:
for file in *.fastq.gz; do
正确的写法要确保变量被双引号包裹:
for file in *.fastq.gz; do input_file="$file" # 后续处理 done
或者用find命令处理带空格的文件:
find . -name "*.fastq.gz" -print0 | while IFS= read -r -d '' input_file; do # 后续处理 done
5. 加调试语句定位问题
要是还是找不到原因,就在条件判断前加echo命令输出变量和判断逻辑,比如:
echo "当前文件名:$filename" echo "判断条件:$filename 是否包含 C57BL6?" if [[ "$filename" == *C57BL6* ]]; then # ... fi
运行脚本后看输出,就能清楚知道是变量不对,还是条件写得有问题。
给你一个参考脚本
这里有个完整的示例脚本,你可以对照着调整:
#!/bin/bash # 定义索引路径 C57_INDEX="/path/to/your/C57BL6_salmon_index" DEFAULT_INDEX="/path/to/your/default_salmon_index" # 遍历所有传入的fastq文件 for input_file in "$@"; do # 提取纯文件名 filename=$(basename "$input_file") # 调试用:输出当前处理的文件名 echo "正在处理文件:$filename" # 双端数据的情况(如果是单端,去掉-1和-2参数) if [[ "$filename" == *C57BL6* ]]; then echo "使用C57BL6基因组索引..." salmon quant -i "$C57_INDEX" -l A \ -1 "${input_file%_R2.fastq.gz}_R1.fastq.gz" \ -2 "$input_file" \ -o "${filename%.*}_quant" else echo "使用默认基因组索引..." salmon quant -i "$DEFAULT_INDEX" -l A \ -1 "${input_file%_R2.fastq.gz}_R1.fastq.gz" \ -2 "$input_file" \ -o "${filename%.*}_quant" fi done
内容的提问来源于stack exchange,提问作者dddxxx
相关产品推荐
相关产品推荐

