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