AWK: extrair linhas se a coluna no arquivo 1 estiver dentro de um intervalo declarado em duas colunas em outro arquivo
Atualmente, estou tendo um problema com o AWK que ainda não consegui resolver. Eu tenho um arquivo enorme (30 GB) com dados genômicos que contém uma lista com posições (declaradas nas colunas 1 e 2) e uma segunda lista que contém vários intervalos (declarados nas colunas 3, 4 e 5). Eu quero extrair todas as linhas no primeiro arquivo em que a posição esteja dentro do intervalo declarado no arquivo de segundos. Como a posição é única apenas dentro de um determinado cromossomo (chr), primeiro ela deve ser testada se os chr forem idênticos (por exemplo, col1 no arquivo 1 corresponde a col3 no arquivo2)
arquivo 1
chromosome position another....hundred.....columns
chr1 816 .....
chr1 991 .....
chr2 816 .....
chr2 880 .....
chr2 18768 .....
...
chr22 9736286 .....
arquivo 2
name identifier chromosome start end
GENE1 ucsc.86 chr1 800 900
GENE2 ucsc.45 chr2 700 1700
GENE3 ucsc.46 chr2 18000 19000
resultado esperado
chromosome position another....hundred.....columns
chr1 816 .....
chr2 816 .....
chr2 880 .....
chr2 18768 .....
Um verão do que pretendo fazer (meio codificado):
(if $1(in file 1) matches $3(in file 2){ ##test if in the correct chr
if ($2(in file 1) >= $4 && =< $5 (in file 2){ ##test if pos is in the range
print $0 (in file 1) ##if so print the row from file1
}
}
Eu meio que entendo como resolver esse problema colocando file1 em uma matriz e usando a posição como índice, mas ainda tenho um problema com o chr e, além disso, o file1 é muito grande para colocar em uma matriz (embora eu tenha 128 GB de RAM). Eu tentei algumas coisas com matrizes multidimensionais, mas também não consegui descobrir como fazer isso.
Muito obrigado por toda sua ajuda.
Atualização 8/5/14 Adicionada uma terceira linha no arquivo 2 que contém outro intervalo no mesmo crom. como na segunda linha. Esta linha é ignorada no script abaixo.