You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键改进点说明

  1. 按样本分组处理:不再逐个文件判断,而是先提取所有样本的唯一前缀,确保每个样本只被处理一次。
  2. 直接检查文件存在性:用-f选项直接判断文件是否存在,比正则匹配文件名更可靠(避免文件名格式异常导致的误判)。
  3. 引号包裹变量:所有路径变量都用双引号括起来,防止文件名包含空格或特殊字符时出错。
  4. 覆盖所有场景:新增了“仅存在未排序文件”的提示,方便你处理遗漏的排序任务。

原脚本的错误细节

  • 你的if [[ ${files} =~ "_aln.bam" ]] && [[ ${files} =~ "_aln_sorted.bam" ]]条件永远为假,因为单个文件不可能同时匹配两个互斥的后缀。
  • 当遍历到未排序文件file1_aln.bam时,它不满足elif的第一个条件(不匹配_aln_sorted.bam),所以会直接跳过所有分支,没有任何输出。

内容的提问来源于stack exchange,提问作者CuriousDude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:32:34