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"
本文来自博客园,作者:Hahntoh,转载请注明原文链接:https://www.cnblogs.com/hahn/p/18802974