技术求助:用Bash+Awk/Sed批量处理FAS文件插入基因名
批量处理FAS文件:将文件名中的基因名插入序列头
嘿,我正好能帮你解决这个批量处理FAS文件的问题!你需要从每个GeneName_something.fas格式的文件名里提取基因名,然后把它加到每个序列头的物种名后面,用连字符分隔对吧?我给你写一个基于Bash+Awk的脚本,直接就能遍历文件夹里的所有FAS文件完成处理。
#!/bin/bash # 遍历当前目录下所有.fas格式的文件 for fas_file in *.fas; do # 如果当前路径不是文件(比如没有匹配到任何.fas文件时),跳过 [ -f "$fas_file" ] || continue # 从文件名中提取基因名:删除从最后一个下划线开始的所有内容(包括.fas后缀) # 比如"COX1_align.fas"会提取出"COX1","Gene_Name_raw.fas"会提取出"Gene_Name" gene_name="${fas_file%_*}" # 使用Awk处理文件:修改所有以>开头的序列头,插入基因名 # 兼容GNU Awk(Linux默认)的原地修改 awk -v gene="$gene_name" ' # 匹配序列头行(以>开头) /^>/ { # 把>后面的第一个单词(物种名)替换为「物种名-基因名」 sub(/^>([^ ]+)/, ">\\1-" gene) } # 输出所有行(修改后的序列头和原序列内容) 1 ' -i inplace "$fas_file" # 打印处理完成的提示 echo "✅ 处理完成:$fas_file" done
针对macOS用户的调整
如果你用的是macOS,系统默认使用BSD Awk,没有-i inplace原地修改选项,把脚本里的Awk行替换成下面这行即可(用临时文件间接修改原文件):
awk -v gene="$gene_name" '/^>/ {sub(/^>([^ ]+)/, ">\\1-" gene)} 1' "$fas_file" > "$fas_file.tmp" && mv "$fas_file.tmp" "$fas_file"
脚本细节说明
- 遍历逻辑:自动扫描当前文件夹下所有
.fas文件,避免无匹配时的错误提示 - 基因名提取:用Bash的参数扩展
${fas_file%_*},完美适配你的GeneName_something.fas命名规则——不管GeneName里有没有下划线,只要后面是_xxx.fas格式,都能正确提取 - Awk处理:精准匹配序列头行,只在物种名后插入基因名,完全保留原序列内容和序列头的其他注释信息(如果有的话)
使用步骤
- 把上面的脚本复制到一个文本文件里,命名为
add_gene_to_headers.sh - 打开终端,进入存放
.fas文件的文件夹 - 给脚本加执行权限:
chmod +x add_gene_to_headers.sh - 运行脚本:
./add_gene_to_headers.sh
内容的提问来源于stack exchange,提问作者Nico64
相关产品推荐
相关产品推荐

