So extrahieren Sie Werte, die kleiner als 0 und Punkt sind, aus bestimmten Spalten und drucken die gesamte Zeile mit awk

So extrahieren Sie Werte, die kleiner als 0 und Punkt sind, aus bestimmten Spalten und drucken die gesamte Zeile mit awk

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.txtDieser 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 +0erzwingt 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

verwandte Informationen