如何计算属于一个簇的序列? (来自 cd-hit 输出)
How to count sequences that belong a cluster? (from cd-hit output)
我有cd-hit输出,我想获得属于同一个簇的序列数。
我的输入:
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-... *
I would like this output:
Cluster 1 1
Cluster 2 5
Cluster 3 2
Cluster 4 1
Cluster 5 1
我只想在第一列中显示簇的名称,在第二列中显示该簇包含的序列数。
最好向我们展示您的尝试,而且我不确定您如何获得与 Cluster 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-... *
我在这里做了很多假设(例如,新的 Clusters 总是以包含字符串 "Cluster #" 的行开始,随后的行包含与每个 "Cluster" 相关的序列)。这只是一种快速思考方法的基本示例,您可能需要对其进行调整以满足您的最终需求。
完美!有用!我只是添加一个排序以获得按数字排序的结果。像这样:
perl count-cluster.pl | sort -k 2 -g | head
然后头部结果:
Cluster 0 64
Cluster 1 1
Cluster 2 5
Cluster 3 2
Cluster 4 1
Cluster 5 1
Cluster 6 1
Cluster 7 3
Cluster 8 1
Cluster 9 1
非常感谢!我的文件中有 3000 多行,我需要三种不同条件下的结果,这很有帮助!谢谢!
我有cd-hit输出,我想获得属于同一个簇的序列数。
我的输入:
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-... *
I would like this output:
Cluster 1 1
Cluster 2 5
Cluster 3 2
Cluster 4 1
Cluster 5 1
我只想在第一列中显示簇的名称,在第二列中显示该簇包含的序列数。
最好向我们展示您的尝试,而且我不确定您如何获得与 Cluster 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-... *
我在这里做了很多假设(例如,新的 Clusters 总是以包含字符串 "Cluster #" 的行开始,随后的行包含与每个 "Cluster" 相关的序列)。这只是一种快速思考方法的基本示例,您可能需要对其进行调整以满足您的最终需求。
完美!有用!我只是添加一个排序以获得按数字排序的结果。像这样:
perl count-cluster.pl | sort -k 2 -g | head
然后头部结果:
Cluster 0 64
Cluster 1 1
Cluster 2 5
Cluster 3 2
Cluster 4 1
Cluster 5 1
Cluster 6 1
Cluster 7 3
Cluster 8 1
Cluster 9 1
非常感谢!我的文件中有 3000 多行,我需要三种不同条件下的结果,这很有帮助!谢谢!