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

Thanks Jethro,

I may ask more questions form our Monks as I am trying to complete this script.

It ran very quick. You are right; the loops had nothing to do with the run time. A+++

  • Comment on Re^2: Reading two files, cmp certain cols

Replies are listed 'Best First'.
Re^3: Reading two files, cmp certain cols
by sesemin (Beadle) on Sep 19, 2008 at 16:40 UTC
    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]); } } } } } } }

      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]); } } } } }
Re^3: Reading two files, cmp certain cols
by Cristoforo (Curate) on Sep 20, 2008 at 23:17 UTC
    I think the problem lies in the 2 loops you have set up Pedro.

    foreach my $position1 (@{$file1{$key}}){

    This array holds the position +/- 8 that you read from the first file. Then, further down in your code, you are also adding plus/minus 8 postions from the position you read from the second file.

    foreach my $pos (@range){

    So I believe that is why you are getting the redundant printout.

    Chris