如何计算属于一个簇的序列? (从cd-hit输出)

时间:2019-07-01 18:35:38

标签: bash perl sequence

我有cd-hit输出,我想获得属于同一集群的序列数。

我的输入:

  

集群1

  0 33aa,> abu-miR-101a:1-8 ... *

  群集2

  0 33aa,> abu-miR-103:1-8 ... *   1 33aa,> NODE_603086_length _... at 100.00%

  2 33aa,> NODE_603086_length _... at 100.00%

  3 33aa,> NODE_603086_length _... at 100.00%

  4 33aa,> NODE_603086_length _... at 100.00%

  群集3

  0 33aa,> abu-miR-10543:1-8 ... *

  1 33aa,> abu-miR-10543:1-8 ... at 100.00%

  群集4

  0 33aa,> abu-miR-10544:1-8 ... *

  群集5

  0 33aa,> abu-miR-10545-5p:1 -... *

  

  

  我想要这个输出:

  群集1 1

  群集2 5

  群集3 2

  群集4 1

  群集5 1

我只想在第一列中找到簇的名称,并在第二列中想要该簇包含的序列数。

2 个答案:

答案 0 :(得分:1)

对您来说,向我们展示您的尝试将是一件好事,而且我不确定您如何获得与簇2相关的5个序列(输出中只有4个,但是我注意到缺少#1从列表中,所以也许是复制/粘贴错误?)。但是,在Perl中完成此操作的一种方法是,既然已经包含了该标签,就逐行读取文件,如果看到'Cluster'字符串,则将其设为哈希键,否则(对于后续行)进行迭代这样的计数:

#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

my %results;
my $cluster;

while (<DATA>) {
    if ($_ =~ /Cluster/) {
        chomp($cluster = $_);
        $results{$cluster} = 0;
    } else {
        $results{$cluster}++;
    }
}

print "$_\t$results{$_}\n" for (sort { $a cmp $b } keys %results);

__DATA__
Cluster 1
0 33aa, >abu-miR-101a:1-8... *
Cluster 2
0 33aa, >abu-miR-103:1-8... * 1 33aa, >NODE_603086_length_... at 100.00%
2 33aa, >NODE_603086_length_... at 100.00%
3 33aa, >NODE_603086_length_... at 100.00%
4 33aa, >NODE_603086_length_... at 100.00%
Cluster 3
0 33aa, >abu-miR-10543:1-8... *
1 33aa, >abu-miR-10543:1-8... at 100.00%
Cluster 4
0 33aa, >abu-miR-10544:1-8... *
Cluster 5
0 33aa, >abu-miR-10545-5p:1-... *

我在这里做了很多假设(例如,新集群将始终从包含字符串“ Cluster#”的行开始,然后是包含与每个“ Cluster”相关的序列的后续行)。这只是思考的一种快速方法的基本示例,您可能必须对其进行调整才能满足最终需求。

答案 1 :(得分:0)

完美!有用!我只是添加一种排序以获得按数字排序的结果。像这样:

perl count-cluster.pl | sort -k 2 -g | head

然后是头结果:

  

集群0 64

  群集1 1

  群集2 5

  群集3 2

  群集4 1

  群集5 1

  群集6 1

  群集7 3

  群集8 1

  群集9 1

非常感谢!我的文件中有3000多行,对于三种不同的情况,我需要此结果,这很有帮助!谢谢!