如何计算每列中的频率,对应于perl中的第一列

时间:2015-05-26 21:23:56

标签: perl

我有这样的输入。

a x1
a x1
a y1
b x1
b y1
b z1
c y1
c z1

想要这样的输出

a = 3, x1= 2, y1= 1, z1= 0     
b = 3, x1= 1, y1= 1, z1=1    
c =2, x1=0, y1=1, z1=1

我想为此制作一个perl程序,但不知道。

请帮助..

1 个答案:

答案 0 :(得分:-1)

这是一个非常简单的作业问题(这就是为什么这个问题已被贬低了几次,毫无疑问),但如果你正在努力解决这个问题,那么它就是展示哈希力量的好方法。

让我们打破这个。您希望按第一列对事物进行分类(并计算出现次数),计算关联数据。哈希是完美的。

让我们假设最终的哈希看起来像这样:

{
    'a' => {
        '*count' => 3,
        'x1' => 2,
        'y1' => 1,
    },
    . . .
}

(其中'*count'是一个永远不会出现在您的数据中的字符串),并且您的输出看起来像您的规范。

解析数据非常简单。

my $hash = {};
my $count = '*count';
for( @lines ) {
    chomp;
    my ($x, $y) = split( /\s+/ );
    $hash->{$x}->{$count}++;
    $hash->{$x}->{$y}++;
}

打印出来就是这么简单:

for my $x ( sort keys %{$hash} ) {
    my @output = ( sprintf( '%s = %d', $x, $hash->{$x}->{$count} ) );
    for my $y ( qw{ x1 y1 z1 } ) {
        push( @output, sprintf( '%s = %d', $y, $hash->{$x}->{$y} ) );
    }
    print join( ', ', @output ) . "\n";
}

请注意,如果$hash->{'c'}->{'z1'}不存在,则返回的值仍为0.如果您愿意,可以使用exists进行额外检查,但不一定需要