생물정보학 작업에서 여러 multifasta 파일의 헤더 이름 바꾸기

생물정보학 작업에서 여러 multifasta 파일의 헤더 이름 바꾸기

나는 다음과 같은 1. 파일을 가지고 있습니다 :

>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삭제해봤습니다 \_. 아니면 제목의 마지막 네 글자를 제거하고 _"주문 번호"를 추가해야 합니까? 즉, ; 다음에 태그 이름을 바꾸고 싶습니다 >. 첫 번째 단계는 ; 를 바꾸고 _각 레이블의 마지막 4개 문자를 제거한 다음 _각 레이블 뒤에 추가하고 마지막으로 각 레이블 뒤에 시퀀스 번호를 추가하는 것입니다. (예: >YP_008856774.1 ~ >YP008856774.1 ~ >YP008856 ~ >YP008856_ ~ >YP008856_1) 현재의 능력으로는 아직 할 수 없습니다. 이 문제를 해결하도록 도와주실 수 있나요? 감사해요.

답변1

모든 Unix 시스템의 모든 쉘에서 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

답변2

$ awk '/^>/ { tag = substr($0,1,3) 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명령은 원래 헤더 줄의 특정 부분(문자 1~3, 문자 5~10, _위치 4 건너뛰기)을 마커로 사용하여 각 헤더 줄을 다시 작성합니다. 각 고유 태그에 대한 카운터를 유지합니다.

이는 원래 식별자가 항상 양식에 있고 XX_NNNNNN그 뒤에 추가 텍스트(무시됨)가 있다고 가정합니다.

당신은 또한 사용할 수 있습니다

awk '/^>/ { sub(/_/, ""); sub(/...\..*/, ""); tag = $0; $0 = sprintf("%s_%d", tag, ++count[tag]) }; 1' file

이는 밑줄을 제거하고 세 문자와 점 뒤에 오는 모든 항목을 포함하여 원래 식별자의 나머지 부분에서 레이블을 생성한다는 점에서 약간 더 동적입니다.

답변3

GNU 사용awk

$ awk -F_ 'BEGIN {c=1} /^>/{match($2,/(.{6}).*/,a); $2=a[1] FS c++}1' OFS="" input_file
>YP008856_1
MHGTRTSAGWSTQPGKFDVLNLRMTFESSSAYQIPDLQPTEFIPTSLAAWNMPRHREYAAVSGGALHFFLDDYRFETVWS
>YP008856_2
MGGRGGGGGPGPGTGAKNKKAGGGSAGGLGGGGGSGGSSGGGGKGTGTTGTGGVQNGSGGGGNGAGGGSSNTTKPVEQYE
>YP008856_3
MQPPIEPVDPPTGDVSPYPNDLLILGGNRWLTITGRILHTPFGDQVELKPNTVKFWEAAAMRGQGKTLSELIV
>YP008856_4
MTWAGSRRRDELPPDWELKYRLPVLSAANWLCEVNGPGCVRAATDVDHKKRGNDHSRSNLQAICRVCHGRKSAAEGVARR

답변4

드디어 알아냈는데 seqkit소프트웨어를 사용해야 해요.

for i in `cat id`; do 
    echo ${i%*${i:(-8)}} | sed "s/\_//g" > tmp
    for j in `cat tmp`; do 
        echo $j
        echo -e ">abc\nACTG\n>123\nATTT" |  seqkit replace -p ".+" -r "$j_{nr}" --nr-width 5 $i > $i.new.gz
        less -S $i.new.gz | sed 's/>/\>'"${j}"_'/g' | sed 's/00//g'> $i.fa
    done
done

관련 정보