
Ich habe eine durch Tabulatoren getrennte Datei und möchte „exonische“ Einträge aus der 2. Spalte, „nicht synonyme SNV“-Einträge aus der 3. Spalte und Werte, die kleiner als (<1) und ein Punkt (.) sind, aus der 4., 5. und 7. Spalte extrahieren.
Chr Func.refGene ExonicFunc.refGene 1000g2015aug_eas 1000g2015a avsnp147 ExAC_ALL
chr1 intergenic synonymous SNV . . . .
chr1 exonic nonsynonymous SNV 1.2 . . .
chr2 exonic nonsynonymous SNV 0.246 . rs2022 0.4061
chr2 intronic synonymous SNV . 0.7386 rs2289093 0.7275
chr2 exonic nonsynonymous SNV 0.6131 0.7376 rs227 0.7167
chr2 intergenic nonsynonymous SNV . 0.231 . .
chr3 exonic synonymous SNV 0.2192 0.2376 rs230 0.2205
chr3 intergenic nonsynonymous SNV 2.01 0.2376 rs230 0.2204
Erwartete Ausgabe
chr2 exonic nonsynonymous SNV 0.246 . rs2289195 0.4061
chr2 exonic nonsynonymous SNV 0.6131 0.7376 rs2276599 0.7167
Es folgt der Code, den ich geschrieben habe.
awk -F'\t' '$2~/exonic/ && $3~/nonsynonymous SNV/ && $4~/^0/ && $5~/^0/ && $7~/^0/{print $0}' inputfile.txt >> outputfile.txt
Dieser extrahiert Einträge, die mit Null beginnen (was kleiner als 1 ist), aus den Spalten 4, 5 und 7, aber ich weiß nicht, wie ich Einträge extrahieren kann, die kleiner als 1 und ein Punkt (.) sind.
Antwort1
Anstelle von Tests mit regulären Ausdrücken würde ich String-Vergleiche für die Strings und numerische Vergleiche für die numerischen Werte vorschlagen, d. h.
$2 == "exonic"
Und
$4+0 < 1
(das +0
erzwingt einen numerischen statt eines lexikalischen Vergleichs). Abgesehen davon geht es nur darum, die Logik richtig zu verstehen:
$ awk -F'\t' '$2 == "exonic" && $3 == "nonsynonymous SNV" && ($4+0 < 1 || $4 == ".") && ($5+0 < 1 || $5 == ".") && ($7+0 < 1 || $7 == ".")' inputfile.txt
chr2 exonic nonsynonymous SNV 0.246 . rs2022 0.4061
chr2 exonic nonsynonymous SNV 0.6131 0.7376 rs227 0.7167