如何用sed命令提取FASTA头文件[]内内容并保留序列?
处理FASTA文件头格式并保留序列的方法
需求场景
现有多序列比对(MSA)FASTA文件,头部格式示例如下:
GAN08245.1/5-191 cyclin-L1 [Mucor ambiguus] LNNPLASLEQLETTVSRR-DGISEELEADLRNLGAELIQSAGILLKLPQVAMATAQVLFQRFFYMSLKEFGI V-EIGGLFLASTHLITVYDLIIRKMKGIVPLDAFSKAYNLKNAIAAEMQILRQLGFIVHVQLPYNMINYLRI LGLISKRAWNYLNDEPATIACAAICREQGIKLPTLPGWWDVSAT-L---------------------- GES74777.1/6-191 cyclin-like protein [Rhizophagus clarus] LQNAILTYGQLETTPSKK-DNIPEELEDELRRLGCDFVQSAGIVLRLPQVAMATAQVLFQRIIKESLLKGH- ----------------------RRYRNNESLEYLGVFYEMKDLVIAEMQILKKLGFNVHVQLPYGMVNYLKV LELIPQKAWGYLNDQPATIACAVIARIAQVKLPTSPPWWEAEDE-ISRHIMRLY-NLPLDELEYLKKG
需要将头部替换为属名首字母+点+种名的格式(如M.ambiguus、R.clarus),同时完整保留序列内容。此前使用awk -F '[][]' '{print $2}' input.fa > output.fa仅提取了物种名称,丢失了序列,需修正。
解决方案
方法1:使用sed命令
利用sed的正则替换功能,仅修改包含物种名称的头部行,序列行保持不变:
sed -E 's/^.*\[([A-Z])[a-z]+ ([a-z]+)\]$/1.2/' input.fa > output.fa
- 逻辑说明:
-E启用扩展正则表达式,简化语法^.*\[([A-Z])[a-z]+ ([a-z]+)\]$匹配头部行:捕获属名的首字母(大写)和完整种名(小写)1.2将整行替换为「属名首字母+点+种名」的格式- 非头部行(序列行)因不匹配正则,直接原样输出
方法2:使用awk命令
改进awk逻辑,区分头部行和序列行分别处理:
awk -F '[][]' '/\[.*\]/ {split($2, sp, " "); print substr(sp[1],1,1)"."sp[2]} !/\[.*\]/ {print}' input.fa > output.fa
- 逻辑说明:
-F '[][]'以[或]为分隔符,提取[]中的物种全称(如Mucor ambiguus)/\[.*\]/匹配头部行:通过split将物种全称按空格分割为属名和种名,再拼接成缩写格式输出!/\[.*\]/匹配序列行:直接原样输出
注意事项
- 如果你的FASTA头部带有标准的
>前缀,只需调整正则表达式,例如sed命令修改为:sed -E 's/^.*\[([A-Z])[a-z]+ ([a-z]+)\]$/>1.2/' input.fa > output.fa - 若物种名称包含特殊字符或大小写不规则,需根据实际情况微调正则规则。
内容的提问来源于stack exchange,提问作者Drishtee Barua
相关产品推荐
相关产品推荐

