如何仅编辑FASTA文件头部第一列,去除连字符后的内容?
处理FASTA文件头部:移除第一列的AccessionID并保留其余内容
原始FASTA文件头部结构:
>Saurogobio_punctatus-NC_080528.1|taxid=1771284|cellularorganisms,Eukaryota,Opisthokonta,Metazoa GCTAGCGTAGCTTAATATAAAGCATAACACTGAAGATGTTAAGATGAGCCCTAA
需求是:仅修改头部的第一列,去除其中连字符-后的AccessionID部分,保留头部其余所有内容,处理后效果如下:
>Saurogobio_punctatus|taxid=1771284|cellularorganisms,Eukaryota,Opisthokonta,Metazoa GCTAGCGTAGCTTAATATAAAGCATAACACTGAAGATGTTAAGATGAGCCCTAA
你之前尝试的sed命令错误原因是正则匹配逻辑有误:它把|作为匹配起点,并用.*$直接删掉了连字符之后的所有内容,导致头部其余部分丢失。
解决方案1:使用awk(适配你之前的处理习惯)
利用awk按|分割字段的特性,只修改第一列,自动保留后续所有字段:
awk 'BEGIN { FS=OFS="|" } /^>/ { sub(/-[^-]*$/, "", $1); print; next } { print }' input.fasta > output.fasta
逻辑说明:
BEGIN { FS=OFS="|" }:设置输入、输出的字段分隔符均为|/^>/:仅匹配FASTA头部行sub(/-[^-]*$/, "", $1):对第一列执行替换,将末尾的-及其后的所有非-字符(即AccessionID)清空print:输出修改后的完整头部行,后续字段自动保留next:跳过后续逻辑,直接处理下一行{ print }:非头部行直接原样输出
解决方案2:使用sed(修正正则匹配逻辑)
调整正则表达式,仅匹配第一列内的目标内容,不影响头部其余部分:
sed -E '/^>/s/^>([^|]+)-[^|]+(.*)/>\1\2/' input.fasta > output.fasta
逻辑说明:
/^>/:仅匹配头部行^>([^|]+)-[^|]+(.*):^>:匹配头部起始的>符号([^|]+):捕获第一列中-之前的物种名称(所有非|字符)-[^|]+:匹配-和后续的AccessionID(直到第一个|为止)(.*):捕获头部中第一个|之后的所有内容
>\1\2:替换为>+ 捕获的物种名称 + 捕获的后续头部内容
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

