Awk
重命名生物資訊作業中幾個 multifasta 文件的標題
我有這樣的 1.files:
>YP_008856774.1 MHGTRTSAGWSTQPGKFDVLNLRMTFESSSAYQIPDLQPTEFIPTSLAAWNMPRHREYAAVSGGALHFFLDDYRFETVWS >YP_008856775.1 MGGRGGGGGPGPGTGAKNKKAGGGSAGGLGGGGGSGGSSGGGGKGTGTTGTGGVQNGSGGGGNGAGGGSSNTTKPVEQYE >YP_008856776.1 MQPPIEPVDPPTGDVSPYPNDLLILGGNRWLTITGRILHTPFGDQVELKPNTVKFWEAAAMRGQGKTLSELIV >YP_008856777.1 MTWAGSRRRDELPPDWELKYRLPVLSAANWLCEVNGPGCVRAATDVDHKKRGNDHSRSNLQAICRVCHGRKSAAEGVARR
我想像這樣重命名每個標籤(例如>YP_008856776.1):
>YP008856_1 MHGTRTSAGWSTQPGKFDVLNLRMTFESSSAYQIPDLQPTEFIPTSLAAWNMPRHREYAAVSGGALHFFLDDYRFETVWS >YP008856_2 MGGRGGGGGPGPGTGAKNKKAGGGSAGGLGGGGGSGGSSGGGGKGTGTTGTGGVQNGSGGGGNGAGGGSSNTTKPVEQYE >YP008856_3 MQPPIEPVDPPTGDVSPYPNDLLILGGNRWLTITGRILHTPFGDQVELKPNTVKFWEAAAMRGQGKTLSELIV >YP008856_4 MTWAGSRRRDELPPDWELKYRLPVLSAANWLCEVNGPGCVRAATDVDHKKRGNDHSRSNLQAICRVCHGRKSAAEGVARR
首先,我曾經
sed -i "s/\_//g" 1.file
刪除\_
. 或者我應該刪除標題的最後四個字元,然後添加_
“訂單號”?簡而言之,我想在>
;之後重命名標籤 第一步是替換_
;然後刪除每個標籤的最後四個字元,然後在每個標籤後添加_
,最後在每個標籤後添加序號。(eg.>YP_008856774.1 to >YP008856774.1 to >YP008856至 >YP008856_ 至 >YP008856_1)。以我現在的能力,還達不到。你能幫我解決麻煩嗎?謝謝。
在每個 Unix 機器上的任何 shell 中使用任何 awk:
$ awk '/>/{$0=substr($0,1,3) substr($0,5,6) "_" (++c)} 1' file >YP008856_1 MHGTRTSAGWSTQPGKFDVLNLRMTFESSSAYQIPDLQPTEFIPTSLAAWNMPRHREYAAVSGGALHFFLDDYRFETVWS >YP008856_2 MGGRGGGGGPGPGTGAKNKKAGGGSAGGLGGGGGSGGSSGGGGKGTGTTGTGGVQNGSGGGGNGAGGGSSNTTKPVEQYE >YP008856_3 MQPPIEPVDPPTGDVSPYPNDLLILGGNRWLTITGRILHTPFGDQVELKPNTVKFWEAAAMRGQGKTLSELIV >YP008856_4 MTWAGSRRRDELPPDWELKYRLPVLSAANWLCEVNGPGCVRAATDVDHKKRGNDHSRSNLQAICRVCHGRKSAAEGVARR
$ awk '/^>/ { tag = substr($0,2,2) substr($0,5,6); $0 = sprintf(">%s_%d", tag, ++count[tag]) }; 1' file >YP008856_1 MHGTRTSAGWSTQPGKFDVLNLRMTFESSSAYQIPDLQPTEFIPTSLAAWNMPRHREYAAVSGGALHFFLDDYRFETVWS >YP008856_2 MGGRGGGGGPGPGTGAKNKKAGGGSAGGLGGGGGSGGSSGGGGKGTGTTGTGGVQNGSGGGGNGAGGGSSNTTKPVEQYE >YP008856_3 MQPPIEPVDPPTGDVSPYPNDLLILGGNRWLTITGRILHTPFGDQVELKPNTVKFWEAAAMRGQGKTLSELIV >YP008856_4 MTWAGSRRRDELPPDWELKYRLPVLSAANWLCEVNGPGCVRAATDVDHKKRGNDHSRSNLQAICRVCHGRKSAAEGVARR
上述
awk
命令將使用原始標題行的特定部分(字元 2 和 3,以及 5 到 10)作為標記來重寫每個標題行。為每個唯一標籤維護一個計數器。這假定原始標識符始終位於表單上,
XX_NNNNNN
後跟任何其他文本(被忽略)。你也可以使用
awk '/^>/ { sub(/_/, ""); sub(/...\..*/, ""); tag = $0; $0 = sprintf("%s_%d", tag, ++count[tag]) }; 1' file
這將更加動態,因為它在刪除下劃線和(包括)一組三個字元和一個點之後的任何內容後,從原始標識符的左側創建標籤。變數的實際值
tag
現在還包括標題行指示符>
,但這與實際輸出無關,因為它不再像在程式碼的第一個變體中那樣$0
插入回。sprintf()