首页 > 解决方案 > 如何使用 Perl 中的循环计算部分文本文件中的元素数量?

问题描述

我正在寻找一种在 Perl 中创建脚本来计算我的文本文件中的元素并分段执行的方法。例如,我的文本文件有这种形式:

ID                       Position   Potential  Jury agreement NGlyc result
(PART 1)
NP_073551.1_HCoV229Egp2   23 NTSY   0.5990     (8/9)           +     
NP_073551.1_HCoV229Egp2   62 NTSS   0.7076     (9/9)           ++        
NP_073551.1_HCoV229Egp2  171 NTTI   0.5743     (5/9)           +     
...
(PART 2)
QJY77946.1_NA             20 NGTN   0.7514     (9/9)           +++   
QJY77946.1_NA             23 NTSH   0.5368     (5/9)           +     
QJY77946.1_NA             51 NFSF   0.7120     (9/9)           ++    
QJY77946.1_NA             62 NTSS   0.6947     (9/9)           ++  
...
(PART 3)
QJY77954.1_NA             20 NGTN   0.7694     (9/9)           +++   
QJY77954.1_NA             23 NTSH   0.5398     (5/9)           +     
QJY77954.1_NA             51 NFSF   0.7121     (9/9)           ++      
...
(PART N°...)

就像您可以看到每个部分的 ID 相同(一个用于 PART 1,另一个用于 PART 2,然后......)。更改只能在位置//潜在//陪审团协议//NGlyc 结果列中看到然后,我的主要目标是计算潜在 0,7 >= 的行。

考虑到这一点,我正在寻找这样的输出:

Part 1: 
1 (one value 0.7 >=)
Part 2: 
2 (two values 0.7 >=)
Part 3: 
2 (two values 0.7 >=)
Part N°:
X numbers of values 0.7 >= 

此输出告诉我每个 ID的正值数(0.7 >=)。

我相信的伪代码是这样的:

foreach ID in LIST
    foreach LINE in FILE
        if (ID is in LINE)
           ... count the line ...
    end foreach LINE
end foreach ID

我正在寻找任何建议(关于包或脚本的想法)或评论以创建更好的脚本。

谢谢!最好的!

标签: perltext-files

解决方案


要计算每个部分与特定列上的某些条件匹配的行数,您可以循环遍历这些行,跳过标题,解析部分编号,然后使用数组来计算每个部分匹配的行数部分。

在此之后,您可以遍历数组中记录的计数并以您的特定格式打印出来。

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

my $part = 0;
my @cnt_part;
while(my $line = <STDIN>) {
    if($. == 1) {
        next;
    }elsif($line =~ m{^\(PART (\d+)\)}) {
        $part = $1;
    }else {
        my @cols = split(m{\s+},$line);
        if(@cols == 6) {
            my $potential = $cols[3];
            if(0.7 <= $potential) {
                $cnt_part[$part]++;
            };
        };
    };
};

for(my $i=1;$i<=$#cnt_part;$i++){
    print "Part $i:\n";
    print "$cnt_part[$i] (values 0.7 <=)\n";
};

要运行它,只需通过 Perl 脚本通过管道传输整个文件:

cat in.txt | perl count.pl

你会得到这样的输出:

Part 1:
1 (values 0.7 <=)
Part 2:
2 (values 0.7 <=)
Part 3:
2 (values 0.7 <=)

如果您还想将计数显示为单词,您可以使用Lingua::EN::Numbers(请参阅此程序)并获得与您帖子中的输出非常相似的输出:

Part 1:
1 (one values 0.7 <=)
Part 2:
2 (two values 0.7 <=)
Part 3:
2 (two values 0.7 <=)

这篇文章中的所有代码也可以在这里找到


推荐阅读