Wie erhalte ich mit awk alle Spalten basierend auf zwei Spalten?

Wie erhalte ich mit awk alle Spalten basierend auf zwei Spalten?

Ich habe eine Datei wie diese:

sample  chr        start      end      ref   alt    gene    effect
AADA-01 chr1    12336579    12336579    C    T     VPS13D    Silent
AADA-02 chr1    20009838    20009838    -   CCA    TMCO4    Missense
AADA-03 chr1    76397825    76397825    GTCA T     ASB17    Missense
AADA-03 chr1    94548954    94548954    C    A     ABCA4    Missense
AADA-04 chr1    176762782   176762782   TCG  C     PAPPA2   Missense
AADA-04 chr1    183942764   183942764   -    T     COLGAL   Missense
AADA-05 chr1    186076063   186076063   A    TGC   HMCN1    Silent
AADA-05 chr1    186076063   186076063   A    T     HM1      Silent

Ich brauche alle Zeilen, bei denen die 5. und 6. Spalte nur ein Zeichen enthalten.

Und das Ergebnis sollte so aussehen:

sample  chr        start      end      ref   alt    gene    effect
AADA-01 chr1    12336579    12336579    C    T     VPS13D    Silent
AADA-03 chr1    94548954    94548954    C    A     ABCA4    Missense
AADA-05 chr1    186076063   186076063   A    T     HM1      Silent

Ich habe versucht, dies zu verwenden.

awk -F'\t' '$5' filename | awk -F'\t' '$6' filename | wc -l

Ich weiß, dass das falsch ist, aber kann bitte jemand meinen Fehler korrigieren.

Antwort1

awk 'NR==1{print; next}
     $5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/' input.txt

Erläuterung

NR==1{print; next}

Dadurch wird die erste Zeile (Kopfzeile) unbedingt gedruckt und mit der nächsten Zeile fortgefahren.

$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/

Dies ist ein bedingter Ausdruck: Wenn das 5. UND das 6. Argument beide mit einem einzelnen Großbuchstaben übereinstimmen, wird die Zeile gedruckt (der Druckbefehl ist in diesem Fall implizit und stellt die Standardanweisung für jede Bedingung dar).

$5und $6stehen für die 5. und 6. Spalte jeder Zeile.

&&ist der logische Operator UND.

~ist der Regexp-Matching-Operator. Er gibt true zurück, wenn das Argument auf der linken Seite mit dem Regexp auf der rechten Seite übereinstimmt.

/^[A-Z]$/ist ein regulärer Ausdruck (regexp). Das Zeichen "/" ist ein Trennzeichen für den regulären Ausdruck, "^" kennzeichnet den Anfang einer Zeile (oder des Strings), "$" das Ende und "[AZ]" steht für alle Großbuchstaben von A bis Z.

Antwort2

awk '$5 ~ /^[ACGT]$/ && $6 ~ /^[ACGT]$/ || NR == 1' data.in

Dies erzeugt für die gegebenen Daten

sample  chr        start      end      ref   alt    gene    effect
AADA-01 chr1    12336579    12336579    C    T     VPS13D    Silent
AADA-03 chr1    94548954    94548954    C    A     ABCA4    Missense
AADA-05 chr1    186076063   186076063   A    T     HM1      Silent

Das awkSkript prüft die Spalten 5 und 6, um zu sehen, ob sie die einzelnen Zeichen A, C, Goder enthalten Toder ob die aktuelle Zeile die erste Zeile der Datei ist. Wenn ja, wird diese Zeile gedruckt.

Der Test $5 ~ /^[ACGT]$/bedeutet „prüfen, ob Spalte fünf dem regulären Ausdruck entspricht ^[ACGT]$“. Der reguläre Ausdruck stimmt mit allem überein, was ein einzelnes Zeichen im angegebenen Satz ( [ACGT]) enthält.

^und $sind „Anker“, sie stimmen nur ganz am Anfang und ganz am Ende (jeweils) der gegebenen Daten überein (Spalte fünf und Spalte sechs).

&&und ||sind die logischen UND- und ODER-Operatoren.

NRist die Ordnungszahl der aktuellen Eingabezeile. Wenn ja, NR == 1dann ist die aktuelle Zeile die Kopfzeile in der Datei. Da die Kopfzeile die auszugebenden Kriterien nicht erfüllt ( refund altkeine einzelnen Buchstaben sind und daher nicht dem regulären Ausdruck entsprechen würden), muss dieser separate Test durchgeführt werden, um sicherzugehen, dass sie in der Ausgabe enthalten ist.

Antwort3

perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in

verwandte Informationen