如何用Bash基于键值对文本文件批量重命名Fastq文件?
批量重命名Fastq文件(基于键值对映射)
问题背景
现有Fastq文件目录结构:
./PBMCs/SRR1_1.fastq ./PBMCs/SRR1_2.fastq ./Monos/SRR2.fastq ./Monos/SRR3.fastq
有一份键值对映射文件(假设命名为name_map.txt),内容如下:
SRR1 pbmc-1 SRR2 mono-1 SRR3 mono-2
需要将文件名中的SRR#替换为对应映射名称,最终得到:
./PBMCs/pbmc-1_1.fastq ./PBMCs/pbmc-1_2.fastq ./Monos/mono-1.fastq ./Monos/mono-2.fastq
你原本的「遍历文件+遍历映射行替换」思路是可行的,但效率偏低,更高效的方式是先把映射加载到内存,再批量处理文件。
解决方案(Bash脚本实现)
步骤1:编写脚本
创建rename_fastq.sh脚本,内容如下:
#!/bin/bash # 检查映射文件是否存在 if [ ! -f "name_map.txt" ]; then echo "错误:映射文件name_map.txt不存在" exit 1 fi # 加载映射到关联数组 declare -A name_map while read -r old_name new_name; do name_map["$old_name"]="$new_name" done < "name_map.txt" # 遍历所有fastq文件 find . -type f -name "*.fastq" | while read -r file_path; do filename=$(basename "$file_path") # 匹配映射中的旧名称并替换 for old in "${!name_map[@]}"; do if [[ "$filename" == "$old"* ]]; then new_filename="${filename/$old/${name_map[$old]}}" new_file_path=$(dirname "$file_path")/"$new_filename" # 执行重命名(预览模式可改为echo mv) mv "$file_path" "$new_file_path" echo "已重命名:$file_path -> $new_file_path" break fi done done
步骤2:执行脚本
- 给脚本添加执行权限:
chmod +x rename_fastq.sh
- 确保
name_map.txt和脚本在同一目录,运行脚本:
./rename_fastq.sh
补充说明
- 脚本会递归查找当前目录下所有
.fastq文件,无需手动逐个指定 - 先将映射文件加载到关联数组,避免重复遍历映射行,提升处理效率
- 若想先预览重命名结果,可将脚本中的
mv改为echo mv,此时仅输出操作内容,不会实际修改文件
内容的提问来源于stack exchange,提问作者Emalek
相关产品推荐
相关产品推荐

