使用 awk sub 函数对 fasta 标头进行顺序编号

使用 awk sub 函数对 fasta 标头进行顺序编号

我是 shell 脚本编写的新手,我正在尝试按顺序对 fasta 文件中的标头进行编号。我的 fasta 文件中的序列如下所示:

>Rodentia sp. 
MALWILLPLLALLILWGPDPAQAFVNQHLCGSHLVEALYILVCGERGFFYTPMSRREVED
PQVGQVELGAGPGAGSEQTLALEVARQARIVQQCTSGICSLYQENYCN

>Ovis aries
MALWTRLVPLLALLALWAPAPAHAFVNQHLCGSHLVEALYLVCGERGFFYTPKARREVEG
PQVGALELAGGPGAGGLEGPPQKRGIVEQCCAGVCSLYQLENYCN

我想在 shell 脚本中使用 awk,以便通过在“>”之后插入从 1 到 n 开始的数字(其中 n 是序列数)来对标头进行顺序编号,以便序列如下所示:

> 1 Rodentia sp. 
MALWILLPLLALLILWGPDPAQAFVNQHLCGSHLVEALYILVCGERGFFYTPMSRREVED
PQVGQVELGAGPGAGSEQTLALEVARQARIVQQCTSGICSLYQENYCN

> 2 Ovis aries
MALWTRLVPLLALLALWAPAPAHAFVNQHLCGSHLVEALYLVCGERGFFYTPKARREVEG
PQVGALELAGGPGAGGLEGPPQKRGIVEQCCAGVCSLYQLENYCN

我尝试使用 awk 中的 sub 函数来执行此操作,将 ">" 的每个实例替换为 "> [a number]"。

awk '/>/{sub(">", "> ++i ")}1' file

但是,我不明白如何使用 awk 中的 sub 函数来增加变量。我想知道是否有办法使用 sub 函数来做到这一点。我了解 sub 的工作原理,但我不知道如何声明要正确递增的变量。

我在 shell 脚本的开头声明 i 为 1:

i=1

但是,我从子函数得到的输出是:

> ++$i Rodentia sp. 
> ++$i Ovis aries 

如何正确声明变量以便我可以使用 awk sub 函数对标题进行编号?

答案1

你很接近,只需将++i带引号的子字符串之外的内容取出"> ++i"即可"> " ++i

awk '/^>/{sub(">", "> "++i " ")}1' infile

答案2

正如 αГsнιn 指出的,您将++i作为文字字符串的一部分插入。

另一种解决方案,可能看起来更漂亮一些:

awk -F '>' '/^>/ { $1 = "> " ++i } { print }' file.fa

或者,如果您喜欢 的简写{ print }

awk -F '>' '/^>/ { $1 = "> " ++i } 1' file.fa

它用作输入字段分隔符,并用所需的字符串替换任何标题行上的第一个字段(输入中为空的>之前的位)。>

相关内容