逐行计算特定元素

时间:2017-05-15 07:38:47

标签: perl

我想计算每行中NN的出现次数,然后删除包含更多NN次出现的行。我写了一个脚本来逐行计算出现次数,但它没有给出所需的输出。

输入:

Qcode   B_32_ISO.GT     B_45_ISO.GT     B_63_ISO.GT     B_72_ISO.GT     B_85_ISO.GT     B_89_ISO.GT     B_9_I
NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN

的Perl

#!/usr/bin/perl

open( In,  "$ARGV[0]" );
open( Out, ">$ARGV[1]" );

%count;

while ( $line = <In> ) {

    chomp( $line );

    if ( $line =~ /rs#/ ) {
        print Out "$line\n";
        next;
    }

    @arr = split( /\t/, $line );

    for ( $i = 11; $i <= $#arr; $i++ ) {
        $count{ $arr[$i] }++;
    }

    while ( my ( $key, $value ) = each( %count ) ) {
        print "$key:$value\n";
    }
}

close In;
close Out;

输出:

TT:2
NN:538
AC:2
AA:6

TT:2
NN:1070
AC:2
CC:6
AA:6
TT:3
CT:1

我想计算每一行的出现次数而不是所有行的求和。

2 个答案:

答案 0 :(得分:0)

在转到下一行之前,你不能清除%count。

为什么不使用strictwarnings?在第6行使用%count;不会做任何事情,只是将其范围限制在循环中更加清晰 - 因此您甚至不需要清除它。

答案 1 :(得分:0)

这会计算一行中NN的数量并跳过包含NN的行:

use strict;
use warnings;

while (my $line = <DATA>) {
    if (my $number_of_nn = (() = $line =~ /(NN)/g)) {
        print "Number of NN is $number_of_nn\n";
    }
    else {
        print $line;
    }
}

__DATA__
Qcode   B_32_ISO.GT     B_45_ISO.GT     B_63_ISO.GT     B_72_ISO.GT     B_85_ISO.GT     B_89_ISO.GT     B_9_I
NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN      NN