使用 sed 根据物种名称对 FASTA 序列文件进行排序

使用 sed 根据物种名称对 FASTA 序列文件进行排序

我有一个包含多个物种的 536 个 DNA 序列的 FASTA 文件,但不一定按照物种名称排序。

我的标题与序列看起来像

>COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P
AATC
>INRMA1514-14|NA|Agabus|thomsoni|ABZ7453|COI-5P
ATTT
>CONOR053-14|NA|Agabus|sturmii|AAJ1337|COI-5P
ACAA
>COLFG676-14|MZ631238|Agabus|adpressus|AEC6988|COI-5P
AATG

这些序列包含字符 {A、C、G、T},长度通常为数百个字符。

我需要所有物种名称一起出现在我的 FASTA 文件中,以及我的数据集中的所有其他物种名称。

这里,“物种”是指 FASTA 标题中位于标题中第三和第四分隔点的物种名称。因此,对于第一个标头 ,">COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P"物种名称为姬松茸

我需要的输出应该是

>COLFG676-14|MZ631238|Agabus|adpressus|AEC6988|COI-5P
AATG
>COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P
AATC
>CONOR053-14|NA|Agabus|sturmii|AAJ1337|COI-5P
ACAA
>INRMA1514-14|NA|Agabus|thomsoni|ABZ7453|COI-5P
ATTT

基本上,我只需要按物种名称排序,以便所有具有相同名称的物种一起出现。注意我可以很容易地得到

>COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P
AATC
>COLFG676-14|MZ631238|Agabus|adpressus|AEC6988|COI-5P
AATG
>CONOR053-14|NA|Agabus|sturmii|AAJ1337|COI-5P
ACAA
>INRMA1514-14|NA|Agabus|thomsoni|ABZ7453|COI-5P
ATTT

其中前两个标头的顺序被交换。重要的是带有物种名称的标题仍然一起出现。

我认为最简单的方法是使用sed(我在 Mac Pro 上运行)。

我知道我应该有类似的东西

sed -i.bak ... file.fas // sort sequences and create a backup copy

但我不确定...应该是什么,因为我是正则表达式的新手。我认为我需要在第三个和第四个分隔符处进行分割|,即|Agabus|adpressus|,但我不确定如何最好地表明这一点。

答案1

您只需按字段 3 和 4 对行进行排序即可。字段由 | 分隔。

$ sed 'N;s/\n/#/g' infile | sort -t '|' -k3,4 | tr '#' '\n'

>COLFG676-14|MZ631238|Agabus|adpressus|AEC6988|COI-5P
AATG
>COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P
AATC
>CONOR053-14|NA|Agabus|sturmii|AAJ1337|COI-5P
ACAA
>INRMA1514-14|NA|Agabus|thomsoni|ABZ7453|COI-5P
ATTT

答案2

sort -t'|' -k3 -k4 fasta.txt

输出:

">COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P"
">COLFG678-14|MZ630002|Agabus|adpressus|AEC6988|COI-5P"
">CONOR053-14|NA|Agabus|sturmii|AAJ1337|COI-5P"
">INRMA1514-14|NA|Agabus|thomsoni|ABZ7453|COI-5P"

-t'|'使用垂直破折号作为字段分隔符。

-k3 -k4按第三和第四字段排序。

相关内容