
次のようなファイルがあります:
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
5 列目と 6 列目に 1 文字のみが含まれる行がすべて必要です。
結果は次のようになります。
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
これを使ってみました。
awk -F'\t' '$5' filename | awk -F'\t' '$6' filename | wc -l
これは間違っていることはわかっていますが、誰か私の間違いを訂正していただけませんか。
答え1
awk 'NR==1{print; next}
$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/' input.txt
説明
NR==1{print; next}
これは最初の行 (ヘッダー) を無条件に印刷し、次の行に進みます。
$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/
これは条件式です。5 番目と 6 番目の引数の両方が 1 つの大文字に一致する場合、その行を印刷します (この場合、印刷コマンドは暗黙的で、すべての条件のデフォルトの命令になります)。
$5
$6
各行の 5 列目と 6 列目を表します。
&&
論理演算子 AND です。
~
正規表現マッチング演算子です。左側の引数が右側の正規表現と一致する場合に true を返します。
/^[A-Z]$/
正規表現 (regexp) です。文字 "/" は正規表現の区切り文字、"^" は行 (または文字列) の始まり、"$" は終わり、"[AZ]" は A から Z までのすべての大文字を意味します。
答え2
awk '$5 ~ /^[ACGT]$/ && $6 ~ /^[ACGT]$/ || NR == 1' data.in
これにより、与えられたデータに対して、
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
このawk
スクリプトは、列 5 と 6 をテストして、単一文字A
、C
、のいずれかであるかどうG
かT
、または現在の行がファイルの最初の行であるかどうかを確認します。そうである場合は、その行を出力します。
このテストは$5 ~ /^[ACGT]$/
、「5 列目が正規表現^[ACGT]$
」に一致するかどうかを確認することを意味します。この正規表現は、指定されたセット ( ) 内の 1 つの文字を含むものすべてに一致します[ACGT]
。
^
これらは$
「アンカー」であるため、指定されたデータの最初と最後 (それぞれ 5 列目と 6 列目) にのみ一致します。
&&
および は||
論理 AND および OR 演算子です。
NR
は、現在の入力行の序数です。 の場合、NR == 1
現在の行はファイル内のヘッダー行です。 ヘッダー行は出力される基準を満たしていないため (単一の文字ではないref
ためalt
、正規表現に一致しません)、出力に確実に含まれるようにするには、この別のテストを実行する必要があります。
答え3
perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in