AWK: extraer líneas si la columna en el archivo 1 cae dentro de un rango declarado en dos columnas en otro archivo
Actualmente estoy luchando con un problema de AWK que aún no he podido resolver. Tengo un archivo enorme (30 GB) con datos genómicos que contiene una lista con posiciones (declaradas en col 1 y 2) y una segunda lista que contiene varios rangos (declarados en col 3, 4 y 5). Quiero extraer todas las líneas en el primer archivo donde la posición cae dentro del rango declarado en el archivo de segundos. Como la posición solo es única dentro de un cierto cromosoma (chr), primero debe probarse si los chr son idénticos (es decir, col1 en el archivo 1 coincide con col3 en el archivo2)
archivo 1
chromosome position another....hundred.....columns
chr1 816 .....
chr1 991 .....
chr2 816 .....
chr2 880 .....
chr2 18768 .....
...
chr22 9736286 .....
archivo 2
name identifier chromosome start end
GENE1 ucsc.86 chr1 800 900
GENE2 ucsc.45 chr2 700 1700
GENE3 ucsc.46 chr2 18000 19000
Rendimiento esperado
chromosome position another....hundred.....columns
chr1 816 .....
chr2 816 .....
chr2 880 .....
chr2 18768 .....
Un resumen de lo que pretendo hacer (medio 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
}
}
Me gusta si entiendo cómo resolver este problema colocando el archivo1 en una matriz y usando la posición como índice, pero todavía tengo un problema con el chr y, además, ese archivo1 es demasiado grande para colocarlo en una matriz (aunque tengo 128 GB de RAM). He intentado algunas cosas con matrices multidimensionales, pero tampoco pude entender cómo hacerlo.
Muchas gracias por toda su ayuda.
Actualización 8/5/14 Se agregó una tercera línea en el archivo 2 que contiene otro rango en el mismo cromo. como en la segunda línea. Esta línea se omite en el script a continuación.