Bash脚本问题:无法正确判断排序与未排序BAM文件的存在状态并执行对应操作
修复你的Bash文件整理脚本
你的脚本逻辑有个核心问题:你在逐个遍历单个BAM文件,然后试图判断这个单一文件是否同时是未排序和排序的版本——这显然不可能,因为一个文件名不可能同时包含_aln.bam和_aln_sorted.bam后缀。这就是为什么第一个条件分支永远不会触发,而只有遍历到排序文件时才会进入elif分支。
修改后的正确脚本
我们需要换个思路:先按样本前缀分组(比如file1是你的样本前缀),然后针对每个前缀检查对应的两个文件是否存在:
#!/bin/bash # 定义目标目录 target_dir="folder1/checkthese" # 第一步:提取所有唯一的样本前缀(去掉_aln相关后缀) prefixes=() for file in "$target_dir"/*.bam; do # 获取文件名(不含路径) base_name=$(basename "$file") # 截取到_aln之前的部分作为样本前缀 sample_prefix=${base_name%%_aln*} prefixes+=("$sample_prefix") done # 对前缀去重(避免重复处理同一个样本) unique_prefixes=($(printf "%s\n" "${prefixes[@]}" | sort -u)) # 第二步:针对每个样本前缀检查文件存在情况 for prefix in "${unique_prefixes[@]}"; do unsorted_file="$target_dir/${prefix}_aln.bam" sorted_file="$target_dir/${prefix}_aln_sorted.bam" if [[ -f "$unsorted_file" && -f "$sorted_file" ]]; then echo "Both files exist for $prefix, deleting unsorted file: $(basename "$unsorted_file")" rm -f "$unsorted_file" elif [[ -f "$sorted_file" && ! -f "$unsorted_file" ]]; then echo "Only sorted file exists for $prefix, all good" elif [[ -f "$unsorted_file" && ! -f "$sorted_file" ]]; then echo "Warning: Only unsorted file exists for $prefix ($(basename "$unsorted_file"))" fi done
关键改进点说明
- 按样本分组处理:不再逐个文件判断,而是先提取所有样本的唯一前缀,确保每个样本只被处理一次。
- 直接检查文件存在性:用
-f选项直接判断文件是否存在,比正则匹配文件名更可靠(避免文件名格式异常导致的误判)。 - 引号包裹变量:所有路径变量都用双引号括起来,防止文件名包含空格或特殊字符时出错。
- 覆盖所有场景:新增了“仅存在未排序文件”的提示,方便你处理遗漏的排序任务。
原脚本的错误细节
- 你的
if [[ ${files} =~ "_aln.bam" ]] && [[ ${files} =~ "_aln_sorted.bam" ]]条件永远为假,因为单个文件不可能同时匹配两个互斥的后缀。 - 当遍历到未排序文件
file1_aln.bam时,它不满足elif的第一个条件(不匹配_aln_sorted.bam),所以会直接跳过所有分支,没有任何输出。
内容的提问来源于stack exchange,提问作者CuriousDude
相关产品推荐
相关产品推荐

