Nonpareil|step1|fq2fa

#!/bin/bash

# 批量将FastQ文件转换为FastA格式的并行脚本
# 用法: ./fq2fa_parallel.sh <input_dir> <output_dir> <file_pattern> <max_jobs>

# 设置默认值
INPUT_DIR=${1:-"./input"}           # 输入目录
OUTPUT_DIR=${2:-"./fasta"}         # 输出目录
FILE_PATTERN=${3:-"*.un.1.fq.gz"}    # 文件匹配模式
MAX_JOBS=${4:-8}                     # 最大并行作业数

# 创建输出目录(如果不存在)
mkdir -p "$OUTPUT_DIR"

# 检查seqtk是否已安装
if ! command -v seqtk &> /dev/null; then
    echo "错误: 未找到seqtk。请安装seqtk: conda install -c bioconda seqtk"
    exit 1
fi

# 计数器
total_files=0
converted_files=0

echo "开始并行将FastQ文件转换为FastA格式..."
echo "输入目录: $INPUT_DIR"
echo "输出目录: $OUTPUT_DIR"
echo "文件匹配模式: $FILE_PATTERN"
echo "最大并行作业数: $MAX_JOBS"
echo "----------------------------"

# 查找匹配的文件并转换(并行处理)
find "$INPUT_DIR" -name "$FILE_PATTERN" | while read fastq_file; do
    (
        # 获取文件名(不含路径和扩展名)
        filename=$(basename "$fastq_file")
        # 替换文件扩展名
        if [[ "$filename" == *.fq.gz ]]; then
            fasta_name="${filename%.fq.gz}.fasta"
        elif [[ "$filename" == *.fastq.gz ]]; then
            fasta_name="${filename%.fastq.gz}.fasta"
        elif [[ "$filename" == *.fq ]]; then
            fasta_name="${filename%.fq}.fasta"
        elif [[ "$filename" == *.fastq ]]; then
            fasta_name="${filename%.fastq}.fasta"
        else
            fasta_name="${filename}.fasta"
        fi
        
        output_path="$OUTPUT_DIR/$fasta_name"

        # 如果文件已存在,则跳过
        if [[ -s "$output_path" ]]; then
            echo "跳过: $output_path (已存在)"
            exit 0
        fi

        echo "转换: $fastq_file -> $output_path"

        # 根据文件是否压缩选择处理方式
        if [[ "$fastq_file" == *.gz ]]; then
            seqtk seq -a "$fastq_file" > "$output_path"
        else
            seqtk seq -a "$fastq_file" > "$output_path"
        fi

        if [ $? -eq 0 ]; then
            echo "✓ 转换成功: $output_path"
            ((converted_files++))
        else
            echo "✗ 转换失败: $fastq_file"
        fi

        ((total_files++))
    ) &  # 关键:& 使其并行执行

    # 控制最大并行作业数
    if [[ $(jobs -r -p | wc -l) -ge $MAX_JOBS ]]; then
        wait -n  # 等待至少一个任务完成
    fi
done

# 等待所有并行任务完成
wait

echo "----------------------------"
echo "转换完成!"
echo "总文件数: $total_files"
echo "成功转换: $converted_files"
echo "转换结果保存在: $OUTPUT_DIR"

# 检查是否有任何文件被转换
if [ $converted_files -eq 0 ]; then
    echo "警告: 没有文件被转换。请检查输入目录和文件匹配模式。"
fi

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

导航