我有一个包含多个物种的 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
按第三和第四字段排序。