修改脚本以包括每次出现名称时的计数 table
Modifying Script to include the Count of a each time a name appears from a table
我在下面有一个脚本,仅当 FILE1 的第一列与 FILE2 的第 10 列匹配时,它才会获取我的 FILE1 并解析出 FILE2。所以它会打印出我需要的行。这部分效果很好。我有点困难的部分是为输出插入一种计数。该脚本的目标是获取末尾的第 10 列并生成输出。在我的列表中有 12 个名字,我想计算每个名字的数量。对于下面的示例,我使用了四个名称。
文件 1:
name1 15
name2 15
name2 30
name5 15
name4 10
name2 5
name2 5
文件 2:
23 15 5.4 1.3 5 55 128 21799 + 32 name2 1 77 0 1
23 20 5.4 1.3 5 55 128 7998 + 18 name4 1 77 0 1
23 20 5.4 1.3 6 55 128 9984 + 13 name4 1 77 1 1
23 20 5.4 1.3 7 55 128 7998 + 14 name5 1 77 2 1
23 20 5.4 1.3 6 55 128 994 + 14 name1 1 77 3
23 20 5.4 1.3 9 55 128 984 + 5 name7 1 77 4 1
23 20 5.4 1.3 5 55 128 99 + 5 name8 1 77 5 1
预期输出
$VAR1 = {
'name1' => 1,
'name2' => 4,
'name4' => 1,
'name5' => 1,
};
5 55 128 21799 32 name2 77 0 1
5 55 128 7998 18 name4 77 0 1
6 55 128 9984 13 name4 77 1 1
7 55 128 7998 14 name5 77 2 1
6 55 128 994 14 name1 77 3 1
name1 1
name2 1
name4 2
name5 1
您可以测试脚本是否有效。我遇到困难的部分是根据输出插入每个名称的计数。 print \%x 是一种检查我的原始列表是否真正被使用的方法,因为我正在处理更大的数据集。如果有人能为我指明正确的方向,告诉我如何修改我的脚本,而不用彻底改变它,那就太好了。我觉得这个脚本可以满足我的大部分需求,即使它不是最有效的方式。
use strict;
use Data::Dumper;
my %x;
open(FILE1, $ARGV[0]) or die "Cannot open the file: $!";
while (my $line = <FILE1>) {
my @array = split(" ", $line);
$x{$array[0]}++;
}
close FILE1;
print Dumper( \%x );
my %count;
open(FILE2, $ARGV[1]) or die "Cannot open the file: $!";
while (my $line = <FILE2>) {
my @name = split(" ", $line);
my $y = $name[9];
if ( $x{ $y } ) {
print join(" ", @name[4,5,6,7,9,11,12,13]), "\n";
$count{@name[9]}++;
}
}
print Dumper (\%count);
close FILE2;
exit;
脚本现在很重要。只需要调试。
"minimal" 更改是在 FILE1
循环中将 %x
的元素设置为 0,然后在 FILE2
中检查 exists $x{$y}
循环并在条件体内执行 ++$x{$y}
。现在最后 %x
有所有出现的次数。
通常的方法(如问题的评论中所述)是声明一个额外的 %count
并在 if 块内执行与上述方法相同的 ++$count{$y}
。
第一个优点和缺点(取决于您的需要)报告计数,即使该名称的发现次数为零。
我在下面有一个脚本,仅当 FILE1 的第一列与 FILE2 的第 10 列匹配时,它才会获取我的 FILE1 并解析出 FILE2。所以它会打印出我需要的行。这部分效果很好。我有点困难的部分是为输出插入一种计数。该脚本的目标是获取末尾的第 10 列并生成输出。在我的列表中有 12 个名字,我想计算每个名字的数量。对于下面的示例,我使用了四个名称。
文件 1:
name1 15
name2 15
name2 30
name5 15
name4 10
name2 5
name2 5
文件 2:
23 15 5.4 1.3 5 55 128 21799 + 32 name2 1 77 0 1
23 20 5.4 1.3 5 55 128 7998 + 18 name4 1 77 0 1
23 20 5.4 1.3 6 55 128 9984 + 13 name4 1 77 1 1
23 20 5.4 1.3 7 55 128 7998 + 14 name5 1 77 2 1
23 20 5.4 1.3 6 55 128 994 + 14 name1 1 77 3
23 20 5.4 1.3 9 55 128 984 + 5 name7 1 77 4 1
23 20 5.4 1.3 5 55 128 99 + 5 name8 1 77 5 1
预期输出
$VAR1 = {
'name1' => 1,
'name2' => 4,
'name4' => 1,
'name5' => 1,
};
5 55 128 21799 32 name2 77 0 1
5 55 128 7998 18 name4 77 0 1
6 55 128 9984 13 name4 77 1 1
7 55 128 7998 14 name5 77 2 1
6 55 128 994 14 name1 77 3 1
name1 1
name2 1
name4 2
name5 1
您可以测试脚本是否有效。我遇到困难的部分是根据输出插入每个名称的计数。 print \%x 是一种检查我的原始列表是否真正被使用的方法,因为我正在处理更大的数据集。如果有人能为我指明正确的方向,告诉我如何修改我的脚本,而不用彻底改变它,那就太好了。我觉得这个脚本可以满足我的大部分需求,即使它不是最有效的方式。
use strict;
use Data::Dumper;
my %x;
open(FILE1, $ARGV[0]) or die "Cannot open the file: $!";
while (my $line = <FILE1>) {
my @array = split(" ", $line);
$x{$array[0]}++;
}
close FILE1;
print Dumper( \%x );
my %count;
open(FILE2, $ARGV[1]) or die "Cannot open the file: $!";
while (my $line = <FILE2>) {
my @name = split(" ", $line);
my $y = $name[9];
if ( $x{ $y } ) {
print join(" ", @name[4,5,6,7,9,11,12,13]), "\n";
$count{@name[9]}++;
}
}
print Dumper (\%count);
close FILE2;
exit;
脚本现在很重要。只需要调试。
"minimal" 更改是在 FILE1
循环中将 %x
的元素设置为 0,然后在 FILE2
中检查 exists $x{$y}
循环并在条件体内执行 ++$x{$y}
。现在最后 %x
有所有出现的次数。
通常的方法(如问题的评论中所述)是声明一个额外的 %count
并在 if 块内执行与上述方法相同的 ++$count{$y}
。
第一个优点和缺点(取决于您的需要)报告计数,即使该名称的发现次数为零。