in reply to Re^4: General program and related problems
in thread General program and related problems

The push array is a problem. Insert print "<@output>\n" after the second while loop and you will see that @output is emtpy or nearly empty. Because it has only the result of the last line in it.

I see you changed something in the first loop. Putting the whole line into %rs with  $rs{$line}= $position; is wrong. You have to store the rsxxx as key otherwise you won't find anything.

Here is the code that is working, at least with my test data. Note that this is exactly your version from two days ago with 'Close' changed to 'close' and the line with the grep changed to use push and without the 'my'. If that isn't working for you it means I'm operating on different data than you

#!/usr/bin/perl -w use strict; my$line; my@fields; my@output; open (FILE1, 'snp.txt') or die "can't open the file: $!"; open (FILE2,'chr22.txt') or die "can't open the file: $!"; open (FD, '>test.txt') or die "can't open the file: $!"; my $position = tell(FILE2); my %rs; while ($line=<FILE2>) { my ($key)= $line=~/^(rs\d{5,})\b/; if (defined $key) { $rs{$key}= $position; } $position=tell(FILE2); } while (defined ($line= <FILE1>)) { my@fields= split (/\s+/ ,$line); push @output, grep /^rs\d{5,}\b/ ,@fields; } foreach (@output) { if (exists $rs{$_}) { seek(FILE2,$rs{$_},0); my $line= <FILE2>; print FD $line; } } close FILE1; close FILE2; close FD;

Replies are listed 'Best First'.
Re^6: General program and related problems
by micky744monk (Novice) on Aug 06, 2009 at 06:31 UTC
    Hello For me @output was fine even without push, just sayin print @output before the foreach loop, I got all the rs from file1. Anyway that is not the problem. My output file is completely empty. This is the line of my data from file 2. Can you tell me how your data looks like? How did you build the test data ? Or I can just send you my data and see if your code is working on them. Cheers

      my testdata was like this:

      snp.txt: ----------- rs34569384 rs123456 rs234567 rs753444 ---------- chr22.txt: --------- bla sijghs bla rs234567 yes,first one fdjg rs123456 yes, second one ---------
        A part for the lenght of the row in file 2 , I do not see any difference. I guess you used tab to split the rs234567 with the others, but since we are looking at the beginning I do not think it makes a big deal. On the other hand my snp.txt doesn't look like that, but it is a collection of rs separated by a space with print "@output" or just a sequence of rs if print @output. So my file1 looks like:
        rs234567rs265897rs2458796rs2658974rs...

        Should I split the rs with /n then print a file 1 and then start from there? In this case I will have a file that looks like yours but that will be a collection of line, no an array