簡體   English   中英

使用特定列中的awk提取模式

[英]Extract a pattern using awk in a specific column

我想通過只取最后一列的一個特定部分來修改文件(gff3格式)!

我的文件看起來像這樣,九個列由制表符空格分隔:

NW_015494524.1 Gnomon 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列和第9列中提取的值組合在一個唯一的列中。預期輸出:

A3GALT2 1220137 1220159 - 0

我曾嘗試使用awk在最后一列中僅采用模式gene = xxxx。 我的基因名稱是帶或不帶數字的大寫字母; 並由';'分隔 第九欄中的分號。

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

它不起作用。 還有另一種方法可以用awksedgrep做得更好嗎?

感謝您的幫助。

以下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

awk解決方案:

awk '{ split($9,a,";"); print substr(a[6],6),$4,$5,$7,$8 }' file
  • split($9,a,";") - 將第9個字段拆分成一個塊數組a ; 作為分隔符

  • substr(a[6],6) - 從substring gene=XXXXXXXX提取所需的基因名稱

輸出:

A3GALT2 1220137 1220159 - 0

一個簡單的awk解決方案

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

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

感謝您的回復和幫助。 是的,我想要你輸出的輸出。 僅保留基因名稱,位置,鏈和相位信息。 它們將被用作新的fasta seqs的標題。 我會嘗試這些命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM