
我有一個這樣的文件:
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
看看它們是否是單一字元A
、C
或,或目前行是否是檔案的第一行。如果是這樣,它將列印該行。G
T
測試的$5 ~ /^[ACGT]$/
意思是「查看第五列是否與正規表示式相符^[ACGT]$
」。正規表示式將符合給定集合 ( ) 中包含單一字元的任何內容[ACGT]
。
^
和$
是“錨點”,它們只會在給定資料(分別)的開頭和結尾(第五列和第六列)匹配。
&&
和||
是邏輯 AND 和 OR 運算子。
NR
是目前輸入行的序號。如果NR == 1
則目前行是文件中的標題行。由於標題行不滿足輸出條件(ref
且alt
不是單個字母,因此與正規表示式不符),因此必須進行此單獨的測試以確保將其包含在輸出中。
答案3
perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in