Nonpareil|step2|Redundancy

#!/bin/bash
# 检查参数是否提供
if [ "$#" -lt 3 ]; then
    echo "用法: $0 <input_fasta_dir> <output_dir> <threads> [max_parallel_jobs]"
    exit 1
fi
# 解析命令行参数
INPUT_DIR=$1
OUTPUT_DIR=$2
THREADS=$3
MAX_JOBS=${4:-10}  # 默认最大并行任务数为 10,可手动修改
# 确保输出目录存在
mkdir -p "$OUTPUT_DIR"
echo "开始处理目录: $INPUT_DIR"
echo "输出目录: $OUTPUT_DIR"
echo "使用线程数: $THREADS"
echo "最大并行任务数: $MAX_JOBS"
echo "--------------------------------"
# 遍历目录下的所有 .fasta 文件
find "$INPUT_DIR" -type f -name "*.fasta" | while read INPUT_FASTA; do
    (
        # 提取 SAMPLE_NAME(去掉 .un.1.fasta 或 .fasta 后缀)
        SAMPLE_NAME=$(basename "$INPUT_FASTA" | sed 's/\.un\.1\.fasta$//' | sed 's/\.fasta$//')
        
        # 检查输出文件是否已存在且非空
        if [[ -s "$OUTPUT_DIR/$SAMPLE_NAME.npo" ]]; then
            echo "⏩ 跳过已完成的样本: $SAMPLE_NAME (.npo文件已存在)"
            exit 0
        fi
        
        # 检查正在运行中的任务
        if [[ -f "$OUTPUT_DIR/$SAMPLE_NAME.npl" && ! -s "$OUTPUT_DIR/$SAMPLE_NAME.npo" ]]; then
            # 检查进程是否仍在运行
            if pgrep -f "nonpareil.*$SAMPLE_NAME" > /dev/null; then
                echo "⏳ 样本 $SAMPLE_NAME 已在其他进程中运行,跳过"
                exit 0
            else
                echo "🔄 发现未完成的任务: $SAMPLE_NAME,将重新处理"
                # 删除可能存在的临时文件
                rm -f "$OUTPUT_DIR/$SAMPLE_NAME.npl"
            fi
        fi
        
        # 检查输入文件是否为空
        if [[ ! -s "$INPUT_FASTA" ]]; then
            echo "❌ 错误: $INPUT_FASTA 文件为空,跳过!"
            exit 1
        fi
        echo "🚀 处理样本: $SAMPLE_NAME"
        
        # 运行 Nonpareil,所有输出文件直接存放在 $OUTPUT_DIR 中
        nonpareil -s "$INPUT_FASTA" \
            -T alignment \
            -f fasta \
            -b "$OUTPUT_DIR/$SAMPLE_NAME" \
            -c \
            -t "$THREADS" \
            -R 4096 \
            -X 2000 \
            -S 0.95
        
        # 检查 Nonpareil 是否成功
        if [[ $? -eq 0 ]]; then
            echo "✅ Nonpareil 分析完成: $SAMPLE_NAME"
        else
            echo "❌ 错误: Nonpareil 处理失败: $SAMPLE_NAME"
        fi
    ) &  # 并行运行
    # 控制最大并行任务数
    if [[ $(jobs -r -p | wc -l) -ge $MAX_JOBS ]]; then
        wait -n  # 等待至少一个任务完成
    fi
done
# 等待所有任务完成
wait
echo "🎉 所有样本处理完成!结果保存在 $OUTPUT_DIR"

posted on 2025-03-31 21:09  Hahntoh  阅读(8)  评论(0)    收藏  举报

导航