批量合并两个同结构文件夹中的FASTQ文件求助
合并结构匹配的FASTQ文件BASH脚本实现
核心思路
遍历其中一个源文件夹(比如Folder_A)的样本目录结构,同步在目标文件夹Folder_C创建对应目录,然后对每个FASTQ.gz文件,将Folder_A和Folder_B中对应路径的文件合并输出到Folder_C的对应位置。
完整脚本
#!/bin/bash # 定义源文件夹和目标文件夹路径,根据实际情况修改 SOURCE_A="./Folder_A" SOURCE_B="./Folder_B" DEST="./Folder_C" # 遍历Folder_A下的所有样本子目录 for sample_dir in "$SOURCE_A"/*/; do # 获取样本目录的名称(比如从Folder_A/Sample_10_DNA/提取Sample_10_DNA) sample_name=$(basename "$sample_dir") # 在目标文件夹创建对应的样本目录,-p参数确保父目录不存在时也能创建,且不报错 mkdir -p "$DEST/$sample_name" # 遍历当前样本目录下的所有FASTQ.gz文件 for fastq_file in "$sample_dir"*.fastq.gz; do # 获取文件名(比如Sample_10_DNA_S7_L001_R1_001.fastq.gz) file_name=$(basename "$fastq_file") # 定义两个源文件和目标文件的完整路径 file_a="$SOURCE_A/$sample_name/$file_name" file_b="$SOURCE_B/$sample_name/$file_name" file_dest="$DEST/$sample_name/$file_name" # 检查两个源文件是否都存在 if [[ -f "$file_a" && -f "$file_b" ]]; then # 合并两个文件到目标路径,>会覆盖已存在的目标文件,若要追加用>>(但合并两个文件应该用>) cat "$file_a" "$file_b" > "$file_dest" echo "已合并: $file_dest" else # 若其中一个文件不存在,输出警告 echo "警告: 缺少文件 - $file_a 或 $file_b,跳过该文件" fi done done echo "所有合并操作完成"
使用说明
- 将脚本保存为
merge_fastq.sh - 根据实际路径修改
SOURCE_A、SOURCE_B、DEST的值(可以用绝对路径,比如/home/user/Folder_A) - 赋予脚本执行权限:
chmod +x merge_fastq.sh - 运行脚本:
./merge_fastq.sh
注意事项
- 脚本假设Folder_A和Folder_B的目录结构完全一致,且样本目录是源文件夹的直接子目录
- 合并.gz文件无需解压,
cat命令可以直接处理gzip压缩文件 - 如果Folder_C中已存在目标文件,脚本会直接覆盖,若需避免覆盖,可以在
cat前添加判断:if [[ ! -f "$file_dest" ]]; then ... fi - 若样本目录有嵌套结构(比如Folder_A/Group1/Sample_10_DNA),可以把遍历方式改为
find "$SOURCE_A" -type d -mindepth 1,再调整路径处理逻辑
内容的提问来源于stack exchange,提问作者Shi Ming Tan
相关产品推荐
相关产品推荐

