修改脚本以包括每次从表中显示名称时的计数

时间:2015-07-24 22:18:30

标签: perl count

我有一个下面的脚本,只有当FILE1的第一列与FILE2的第10列匹配时才接受我的FILE1并解析出FILE2。所以它会打印出我需要的行。这部分效果很好。我遇到一点困难的部分是为输出插入一种计数。脚本的目标是在结尾处使用第10列并生成输出。在我的列表中有12个名字,我想得到每个名字的计数。对于下面的示例,我使用了四个名称。

FILE1:

name1 15
name2 15
name2 30
name5 15
name4 10
name2 5
name2 5

FILE2:

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;

脚本现在很重要。只需要调试。

1 个答案:

答案 0 :(得分:1)

“最小”更改是在%x循环中将FILE1的元素设置为0,然后检查exists $x{$y}循环中的FILE2并执行{ {1}}在条件体内。现在结束时++$x{$y}有所有事件的计数。

通常的方式(如问题评论中所述)将声明一个额外的%x并在if块中执行与上述方法相同的%count

第一个具有报告计数的优势和劣势(取决于您的需要),即使名称找到零也是如此。