Perl 在一列中汇总基于特定功能的表

Perl 在一列中汇总基于特定功能的表,perl,Perl,我试图根据第1列中相同的功能总结下表: 填充: A m A m A n A n A m A c A m A i A n A n B n B n B n B n B n B n C o C i C q 我写了下面的代码,但我不知道为什么它不报告最后一个特性 perl co

我试图根据第1列中相同的功能总结下表:

填充:

A       m
A       m
A       n
A       n
A       m
A       c
A       m
A       i
A       n
A       n
B       n
B       n
B       n
B       n
B       n
B       n
C       o
C       i
C       q
我写了下面的代码,但我不知道为什么它不报告最后一个特性

perl code.pl 1 2 infle

use warnings;
use strict;

my $col_feature         = $ARGV[0];
my $col_to_be_collapsed = $ARGV[1];

my $infile = $ARGV[2];

open( my $fh1, "<$infile" );

my $temp;
my $line_count = 0;
my %count      = ();
my @array      = ();

while ( my $line = <$fh1> ) {
    chomp($line);

    my @line            = split( "\t| ", $line );
    my $to_be_collapsed = $line[ $col_to_be_collapsed - 1 ];
    my $feature         = $line[ $col_feature - 1 ];

    if ( $line_count >= 1 && $temp ne '' ) {

        my @temp                 = split( "\t| ", $temp );
        my $to_be_collapsed_temp = $temp[ $col_to_be_collapsed - 1 ];
        my $feature_temp         = $temp[ $col_feature - 1 ];

        if ( $feature_temp eq $feature ) {
            push( @array, $to_be_collapsed );
        }

        else {
            map { $count{$_}++ } @array;
            print "$feature_temp:\t";
            print "$_:$count{$_}\t" foreach sort { $a cmp $b } keys %count;

            %count = ();
            @array = ();
            $temp  = $line;

            push( @array, $to_be_collapsed );
            print "\n";
        }
    }

    else {
        $temp = $line;
        push( @array, $to_be_collapsed );
    }
    $line_count++;
}

#print $temp,"\n";
但是在第一列中没有任何关于C的报告


谢谢

在这种特殊情况下使用散列会容易得多,因为您只需要保留一个计数器

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

#open my $fh, '<', 'infile';       # Uncomment for live file.
my $fh = \*DATA;                  # For testing only.

my %counter;

while (<$fh>) {
    my ( $outerkey, $innerkey ) = split;
    $counter{$outerkey}{$innerkey}++;
}

for my $outerkey ( sort keys %counter ) {
    print "$outerkey:";
    print "\t$_:$counter{$outerkey}{$_}" for sort keys %{ $counter{$outerkey} };
    print "\n";
}

__DATA__
A       m
A       m
A       n
A       n
A       m
A       c
A       m
A       i
A       n
A       n
B       n
B       n
B       n
B       n
B       n
B       n
C       o
C       i
C       q

在这种特殊情况下,使用散列会容易得多,因为您只需要保留一个计数器

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

#open my $fh, '<', 'infile';       # Uncomment for live file.
my $fh = \*DATA;                  # For testing only.

my %counter;

while (<$fh>) {
    my ( $outerkey, $innerkey ) = split;
    $counter{$outerkey}{$innerkey}++;
}

for my $outerkey ( sort keys %counter ) {
    print "$outerkey:";
    print "\t$_:$counter{$outerkey}{$_}" for sort keys %{ $counter{$outerkey} };
    print "\n";
}

__DATA__
A       m
A       m
A       n
A       n
A       m
A       c
A       m
A       i
A       n
A       n
B       n
B       n
B       n
B       n
B       n
B       n
C       o
C       i
C       q

tnx@jaypal,处理一个大文件怎么样?我想如果我把所有的都保存在一个散列中,它需要大量的内存。我说的对吗?@EpiMan因为我们只存储唯一密钥的计数,所以这将比基于阵列的解决方案更有效。tnx@jaypal,处理一个大文件怎么样?我想如果我把所有的都保存在一个散列中,它需要大量的内存。我说的对吗?@EpiMan因为我们只存储唯一密钥的计数,所以这将比基于阵列的解决方案效率更高。
A:  c:1 i:1 m:4 n:4
B:  n:6
C:  i:1 o:1 q:1