in reply to Re^2: Reading two files, cmp certain cols
in thread Reading two files, cmp certain cols

Hi Jethro,

If I want to add a simple counter to count the number of lines in the output (print statement) do you know what it correct way. I pushed one of the variables into an array and counted used the scalar as a counter. But I think there should be a better way.

while(<INPUT2>){ chomp; my @current_line = split /\t/; push (@{$file2{$current_line[1]}}, $current_line[2]); if (exists $file1{$current_line[1]} ) { my $key = $current_line[1]; foreach my $position1 (@{$file1{$key}}){ if ($current_line[1] eq $key) { if ($current_line[2] == $position1) { if ($current_line[5] ==1) { if ($current_line[14] >= 3){ print RESULTS join ("\t", $current_line[1],$current_lin +e[2],$current_line[5],$current_line[14], "***",$key, $position1), "\n +"; push (@true_positives, $current_line[1]); } } } } } } }

Replies are listed 'Best First'.
Re^4: Reading two files, cmp certain cols
by jethro (Monsignor) on Sep 19, 2008 at 23:39 UTC

    Counting needs two steps: Setting the counter to 0 before the loop and the incrementing step:

    #Initialize the counter before the loop my $true_positives=0; while(<INPUT2>){ ... #instead of the push $true_positives++;

    That's it, $true_positives has the number of positive results after the loop

      Hi Jethro,

      In the following loop, I am going to check if ($current_line14 >= 3) then I want to fake around $current_line2 plus/minus 8. Then check if

      $current_line[1] eq $key && $current_line[5] == 1 && $current_line [2] = $position1) {
      I did the following and again it is loop within a loop and makes it to print a lot of redundant stuff.

      I appreciate any help or solution.

      Pedro

      my $from = 0; my $to =0; my @range =(); while(<INPUT2>){ chomp; my @current_line = split /\t/; if (exists $file1{$current_line[1]} ) { my $key = $current_line[1]; foreach my $position1 (@{$file1{$key}}){ if ($current_line[14] >= 3){ $from = $current_line[2]-8; $to = $current_line[2]+8; for ($from .. $to){ push (@range, $_); } } foreach my $pos (@range){ if ($pos = $position1) { if ( $current_line[1] eq $key && $current_line[5] == 1 ) { print join ("\t", $current_line[1],$current_line[2],$current_line[5],$ +current_line[14], "***",$key, $position1), "\n"; $true_positives++; push (@{$file2{$current_line[1]}}, $current_line[5]); } } } } }

        "fake" is definitely the wrong word. So I can only guess what you want to do from your code. You seem to check if $position1 is between $current_line2-8 and $current_line2+8. In that case you have a bug in your code, in the line if ($pos = $position1) { the '=' should have been a '=='. Furthermore the loop isn't necessary, you only need two comparisions instead:

        # $from = $current_line[2]-8; # $to = $current_line[2]+8; # for ($from .. $to){ # push (@range, $_); # } # } # foreach my $pos (@range){ # if ($pos == $position1) { # substitute with if ($position1>=$current_line[2]-8 and $position1<=$current_line[2]+8) {