如何使用 awk 取得基於兩個欄位的所有欄位?

如何使用 awk 取得基於兩個欄位的所有欄位?

我有一個這樣的文件:

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

我需要第五列和第六列僅包含一個字元的所有行。

結果應該如下圖所示:

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 個參數都符合單個大寫字母,則列印該行(在這種情況下,列印命令是隱式的,是任何條件的預設指令)。

$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

此腳本測試第 5 列和第 6 列,awk看看它們是否是單一字元AC或,或目前行是否是檔案的第一行。如果是這樣,它將列印該行。GT

測試的$5 ~ /^[ACGT]$/意思是「查看第五列是否與正規表示式相符^[ACGT]$」。正規表示式將符合給定集合 ( ) 中包含單一字元的任何內容[ACGT]

^$是“錨點”,它們只會在給定資料(分別)的開頭和結尾(第五列和第六列)匹配。

&&||是邏輯 AND 和 OR 運算子。

NR是目前輸入行的序號。如果NR == 1則目前行是文件中的標題行。由於標題行不滿足輸出條件(refalt不是單個字母,因此與正規表示式不符),因此必須進行此單獨的測試以確保將其包含在輸出中。

答案3

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

相關內容