bash - 如何计算属于集群的序列?(来自 cd-hit 输出)
问题描述
我有 cd-hit 输出,我想获得属于同一簇的序列数。
我的输入:
集群 1
0 33aa,>abu-miR-101a:1-8... *
集群 2
0 33aa,>abu-miR-103:1-8... * 1 33aa,>NODE_603086_length_... 在 100.00%
2 33aa,>NODE_603086_length_... 在 100.00%
3 33aa,>NODE_603086_length_... 在 100.00%
4 33aa,>NODE_603086_length_... 在 100.00%
集群 3
0 33aa,>abu-miR-10543:1-8... *
1 33aa,>abu-miR-10543:1-8... 在 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 关联的 5 个序列(您的输出中只有 4 个,但我注意到列表中缺少 #1 ,所以可能是复制/粘贴错误?)。但是,在 Perl 中执行此操作的一种方法是,由于您已包含该标记,因此逐行读取文件,如果您看到“集群”字符串,请将其设为哈希键,否则(对于后续行),迭代像这样的计数:
#!/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”相关的序列的后续行)。这只是一种快速思考方法的基本示例,您可能必须对其进行调整以满足您的最终需求。
推荐阅读
- jquery - jqgrid远程数据+冻结列+内联动作按钮=动作按钮无响应?
- scala - Spark:用 Spark 绘制模型的学习曲线
- reactjs - 如何将scss文件作为变量导入与打字稿反应
- android - RecyclerView 不能在 onBindViewHolder() 中使用 setText()
- php - 在php中解析为SimpleXML后XML字符串为空
- git - 只获取已经合并到 master/develop 的远程分支
- android - WebView onKeyListener 不起作用
- vba - 条件满足时在 Excel 中复制和粘贴行而不覆盖
- powershell - 无法使用 PowerShell 连接到数据库
- api - BulkSMS 上的访问控制允许来源问题