2017-10-21 48 views
3

我想通過只取最後一列的一個特定部分來修改文件(gff3格式)!在特定列中使用awk提取模式

我的文件看起來像這樣與標籤空格分隔的九列:

NW_015494524.1時針CDS 1220137 1220159。 - 0 ID = cds20267; Parent = rna22739; Dbxref = GeneID:107513619,Genbank:XP_016006018.1; Name = XP_016006018.1; gbkey = CDS; gene = A3GALT2; product = alpha_1%2C3-galactosyltransferase_2 protein_id = XP_016006018.1

我想只提取出現在最後一列($ 9)中的我的基因名稱(; gene = XXX;)。輸入:

NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 A3GALT2

後這個工作,我想列4,5,7,8和九關口提取值的唯一列 期望輸出相結合:

A3GALT2 1220137 1220159 - 0

我試圖使用awk在最後一列中只採用模式gene = xxxx。我的基因名稱是帶或不帶數字的大寫字母;並以';'分隔分號在第九列。

awk FS "[ \t]" '$9 ~/gene=[A-Z0-9]$/ {print $0, $4, $5, $7, $8}' <file> 

它不工作。是否有另外一種方法可以與awksedgrep比較好?

感謝您提前給予幫助。

+0

您希望輸出爲NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0 A3GALT2'或'NW_015494524.1 Gnomon CDS 1220137 1220159。 - 0',請給我們解釋一下嗎? – RavinderSingh13

+0

對不起。我想分兩部分來做,但我可以一次完成。我想要基因名稱,位置,鏈和階段。感謝解決方案。 – Nico64

回答

2

以下awk應該幫助你。

awk '{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));$NF=""} 1' Input_file 

輸出如下。

NW_015494524.1 Gnomon CDS 1220137 1220159 . - 0 A3GALT2 

編輯:正如我在評論中曾提到過我很困惑,你的情況下,需要哪些輸出,你需要你的第二個顯示輸出以下可能會幫助你一樣。

awk '$9 ~ /.*gene=/{sub(/.*gene=/,"",$(NF-1));sub(/\;.*/,"",$(NF-1));print $9,$4,$5,$7,$8} ' Input_file 

輸出如下。

A3GALT2 1220137 1220159 - 0 
1

AWK溶液:

awk '{ split($9,a,";"); print substr(a[6],6),$4,$5,$7,$8 }' file 
  • ​​- 析取所需基因 - 使用;作爲分隔

  • substr(a[6],6)分裂第九字段成塊a的陣列從子命名gene=XXXXXXXX

輸出:

A3GALT2 1220137 1220159 - 0 
1

簡單AWK溶液

$ awk '{match($9,/gene=(\w+);/,a); print a[1],$4,$5,$7,$8}' file 
A3GALT2 1220137 1220159 - 0 

{match($9,/gene=(\w+);/,a);:這將在$9匹配正則表達式gene=(\w+);和捕獲組(\w+)這將存儲在數組a中就是這樣。

+0

謝謝。好的,以便將我需要的數組的基因排除在基因名稱周圍的ad()上。如果我不放一個,數組$ 0是默認捕獲存儲空間嗎? – Nico64

+0

@ Nico64:你不必在你的源輸入文件中加入'()'。 'match()函數中的'()'告訴捕獲paranthesis中提到的模式。另外,如果我們沒有在'match'函數中指定'a',那麼它將不會被存儲,但是我們可以使用'RSTART'和'RLENGTH'參數,這些參數在調用'match'函數時默認設置。 'RSTART'表示第一個匹配字符的索引,如果不匹配,則爲0;如果不匹配,則爲'RLENGTH',長度爲-1。 – batMan

+0

好的。是的,對於括號,我的意思是不在我的基因名稱在infile中,而是在awk命令中僅將名稱作爲存儲的模式。 – Nico64

0

感謝您的回覆和幫助。是的,我希望你的輸出。只保留基因名稱,位置,鏈和相位信息。它們將被用作新的fasta序列的頭部。我會嘗試這些命令。