修改脚本以包括每次出现名称时的计数 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}

第一个优点和缺点(取决于您的需要)报告计数,即使该名称的发现次数为零。