我有一个下面的脚本,只有当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;
脚本现在很重要。只需要调试。
答案 0 :(得分:1)
“最小”更改是在%x
循环中将FILE1
的元素设置为0,然后检查exists $x{$y}
循环中的FILE2
并执行{ {1}}在条件体内。现在结束时++$x{$y}
有所有事件的计数。
通常的方式(如问题评论中所述)将声明一个额外的%x
并在if块中执行与上述方法相同的%count
。
第一个具有报告计数的优势和劣势(取决于您的需要),即使名称找到零也是如此。