
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).
$5
und $6
stehen 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 awk
Skript prüft die Spalten 5 und 6, um zu sehen, ob sie die einzelnen Zeichen A
, C
, G
oder enthalten T
oder 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.
NR
ist die Ordnungszahl der aktuellen Eingabezeile. Wenn ja, NR == 1
dann ist die aktuelle Zeile die Kopfzeile in der Datei. Da die Kopfzeile die auszugebenden Kriterien nicht erfüllt ( ref
und alt
keine 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