根据正则表达式模式更改 fasta header

Change fasta header based on regex pattern

我有一个 fasta 文件 headers 有两种模式,像这样

>256_Org1 
MAVVIIKDAADDSLARRD

>Org2_10005 
DSLARRDMAVVIIKDAA

我只想保留单词并删除数字。我尝试使用建议的 awk 一个衬里,但用定界符 '_' 分隔并在后面用 {print } 给出 256(错误)或 Org2(正确)。我期望的输出是

>Org1 
MAVVIIKDAADDSLARRD

>Org2 
DSLARRDMAVVIIKDAA

在 textwrangler 中,我可以分两步替换它,1\>\d+\_>2 \_\d+\n\n。但是我有几百个文件,想使用 one-liner。有什么建议吗?

使用 GNU sed:

sed -E 's/^>[0-9]+_/>/; s/_[0-9]+ *$//' file

输出:

>Org1 
MAVVIIKDAADDSLARRD

>Org2
DSLARRDMAVVIIKDAA

以下 awk 解决方案也可能对您有所帮助。

awk 'NF && />/ && /[0-9]+/{sub(/_[0-9]+/,"");sub(/[0-9]+_/,"")} 1' Input_file

一个简单的sed脚本:

/^>/!b                 # if it's not a FASTA header line, don't touch it
s/\([>_]\)[0-9]*_//g # zap internal all-numeric field
s/_[0-9]*$//           # zap terminal all-numeric field if present

作为 sed 一行,您可以应用于所有文件:

sed -i~ -e '/^>/!b' -e 's/\([>_]\)[0-9]*_//g' -e 's/_[0-9]*$//' *.fasta

-i~ 导致 sed 执行就地替换,将原始文件备份为文件名,最后附加波浪号。

并非所有 sed 实现都像多个 -e 参数,我对 [0-9]* 有点草率,因为并非所有 sed 方言都有表达 [0-9]+ 在这里更合适。如果你有 sed -rsed -E 那将是一个很好的改进,但同样,如果没有关于你所在平台的信息,我不想 post 推测性变化。