Awk

重命名生物資訊作業中幾個 multifasta 文件的標題

  • July 28, 2022

我有這樣的 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()

引用自:https://unix.stackexchange.com/questions/711490