Awk bedingter Filter einer Datei basierend auf einer anderen (oder einer anderen Lösung)
Programmieranfänger benötigen hier einige Hilfe zum Ändern eines AWK-Skripts, um es bedingt zu machen. Alternative Non-awk-Lösungen sind ebenfalls sehr willkommen.
HINWEIS Die Hauptfilterung funktioniert jetzt dank der Hilfe von Birei, aber ich habe ein zusätzliches Problem, siehe Hinweis unten für Details.
Ich habe eine Reihe von Eingabedateien mit 3 Spalten wie folgt:
chr4 190499999 190999999
chr6 61999999 62499999
chr1 145499999 145999999
Ich möchte diese Zeilen verwenden, um eine andere Datei (refGene.txt) zu filtern, und wenn eine Zeile in Datei 1 eine Zeile in refGene.txt berechnet, um Spalte 13 in refGene.txt in eine neue Datei 'ListofGenes_ $ f' auszugeben. Das Schwierige für mich ist, dass es als Übereinstimmung gezählt werden soll, solange Spalte 1 (z. B. 'chr4', 'chr6', 'chr1') und Spalte 2 UND / ODER Spalte 3 mit den entsprechenden Spalten in refGene übereinstimmen. TXT-Datei. Die entsprechenden Spalten zwischen den beiden Dateien lauten $ 1 = $ 3, $ 2 = $ 5, $ 3 = $ 6. Dann bin ich mir in awk nicht sicher, wie ich nicht die ganze Zeile aus refGene.txt drucken soll, sondern nur die Spalte 13.
HINWEIS Ich habe die oben beschriebene bedingte Filterung dank der Hilfe von Birei erreicht. Jetzt muss ich eine zusätzliche Filterbedingung einbauen. Ich muss auch die Spalte $ 13 aus der Datei refGene.txt ausgeben, wenn sich einer der Bereiche zwischen $ 2 und $ 3 mit dem Bereich zwischen $ 5 und $ 6 in der Datei refGene.txt überschneidet. Dies scheint viel schwieriger zu sein, da mathematische Berechnungen erforderlich sind, um festzustellen, ob sich die Regionen überlappen.
Mein bisheriges Drehbuch:
FILES=/files/*txt
for f in $FILES ;
do
awk '
BEGIN {
FS = "\t";
}
FILENAME == ARGV[1] {
pair[ $1, $2, $3 ] = 1;
next;
}
{
if ( pair[ $3, $5, $6 ] == 1 ) {
print $13;
}
}
' $(basename $f) /files/refGene.txt > /files/results/$(basename $f) ;
done
Jede Hilfe wird sehr geschätzt. Vielen Dank!
Rubal