如何使用 Perl 中的循环计算文本文件部分中的元素数?

How to count the numbers of elements in parts of a text file using a loop in 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 都相同(一个用于第 1 部分,另一个用于第 2 部分,然后...)。变化只能在 Position//Potential//Jury agreement//NGlyc result 列中看到 然后,我的主要目标是计算 Potential 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

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

谢谢!最好!

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

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

#!/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 = ;
    }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 (see this program ) 并且您会得到与 post:

中的输出非常相似的输出
Part 1:
1 (one values 0.7 <=)
Part 2:
2 (two values 0.7 <=)
Part 3:
2 (two values 0.7 <=)

这个post中的所有代码也是available here