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
本文来自博客园,作者:Hahntoh,转载请注明原文链接:https://www.cnblogs.com/hahn/p/18803024
浙公网安备 33010602011771号