AWK: Zeilen extrahieren, wenn die Spalte in Datei 1 in einen Bereich fällt, der in zwei Spalten in einer anderen Datei deklariert ist
Derzeit habe ich mit einem AWK-Problem zu kämpfen, das ich noch nicht lösen konnte. Ich habe eine riesige Datei (30 GB) mit Genomdaten, die eine Liste mit Positionen (in Spalte 1 und 2 deklariert) und eine zweite Liste mit einer Reihe von Bereichen (in Spalte 3, 4 und 5 deklariert) enthält. Ich möchte alle Zeilen in der ersten Datei extrahieren, in denen die Position innerhalb des in der Sekundendatei angegebenen Bereichs liegt. Da die Position nur innerhalb eines bestimmten Chromosoms (chr) eindeutig ist, muss zuerst geprüft werden, ob die chr identisch sind (dh col1 in Datei 1 stimmt mit col3 in Datei2 überein)
Datei 1
chromosome position another....hundred.....columns
chr1 816 .....
chr1 991 .....
chr2 816 .....
chr2 880 .....
chr2 18768 .....
...
chr22 9736286 .....
Datei 2
name identifier chromosome start end
GENE1 ucsc.86 chr1 800 900
GENE2 ucsc.45 chr2 700 1700
GENE3 ucsc.46 chr2 18000 19000
erwartete Ausgabe
chromosome position another....hundred.....columns
chr1 816 .....
chr2 816 .....
chr2 880 .....
chr2 18768 .....
Eine Zusammenfassung dessen, was ich vorhabe (halbcodiert):
(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
}
}
Ich bin froh, wenn ich verstehe, wie ich dieses Problem lösen kann, indem ich file1 in ein Array lege und position als Index verwende, aber dann habe ich immer noch ein Problem mit chr und außerdem ist file1 viel zu groß, um es in ein Array zu legen (obwohl ich 128 GB habe) RAM). Ich habe einige Dinge mit mehrdimensionalen Arrays ausprobiert, konnte aber auch nicht wirklich herausfinden, wie das geht.
Vielen Dank für all Ihre Hilfe.
Update 05.08.14 Eine dritte Zeile in Datei 2 wurde hinzugefügt, die einen weiteren Bereich im selben Chrom enthält. wie in der zweiten Zeile. Diese Zeile wird im folgenden Skript übersprungen.