如何使用 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。
我正在寻找一种方法来在 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。