awk を使用して 2 つの列に基づいてすべての列を取得するにはどうすればよいでしょうか?

awk を使用して 2 つの列に基づいてすべての列を取得するにはどうすればよいでしょうか?

次のようなファイルがあります:

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 をテストして、単一文字AC、のいずれかであるかどうGT、または現在の行がファイルの最初の行であるかどうかを確認します。そうである場合は、その行を出力します。

このテストは$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

関連情報