나는 다음과 같은 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