목록의 새 ID를 기반으로 fasta 파일의 seq ID 바꾸기

목록의 새 ID를 기반으로 fasta 파일의 seq ID 바꾸기

fasta 파일이 있는데 seq ID(설명 줄)를 새로운 확장 ID로 바꾸고 싶습니다. fasta 파일의 형식은 다음과 같습니다.

>3C-assembly|contig_74
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>3C-assembly|contig_75
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>3C-assembly|contig_76
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
...................

다음 형식으로 새로운 fasta를 달성하려고 합니다.

>Scaffold_001 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>Scaffold_002 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
>Scaffold_003 [Sex=Female] [Unplaced scaffold]
TAATAAAAAATATTTTTTTAATTGACCCTAACCAAATCCTGAACCTAACCGTAACACTGA
....................

예를 들어 3C-assemblies|contig_74는 Scaffold_001 [Sex= Female] [Unplaced scaffold]로 대체되어야 함을 의미합니다. 이를 위해 두 IDS를 연결하는 두 개의 열(탭으로 구분)이 포함된 텍스트 파일을 만들었습니다.

3C-assembly|contig_74   Scaffold_001 [Sex=Female] [Unplaced scaffold]
3C-assembly|contig_75   Scaffold_002 [Sex=Female] [Unplaced scaffold]
3C-assembly|contig_76   Scaffold_003 [Sex=Female] [Unplaced scaffold]
......................

내 fasta 파일의 ID를 대체하기 위해 이 텍스트 파일을 어떻게 사용할 수 있는지 아시나요? 감사합니다

답변1

사용 awk:

awk -F'\t' '
  NR==FNR{ a[$1]=$2; next }
  /^>/{ 
    id=a[substr($0, 2)]
    if (id!=""){ print ">" id; next }
  }
  1
' textfile file.fasta

먼저 매핑이 포함된 텍스트 파일을 읽고 첫 번째 필드를 a인덱스로 사용하여 두 번째 필드를 배열에 저장합니다. 기록 으로 건너뛰세요 next.

그런 다음 fasta 파일을 읽으십시오. 레코드가 로 시작하는 경우 현재 레코드( )에서 첫 번째 문자를 제거하고 이 값을 배열 인덱스로 사용하여 >배열에서 새 ID를 찾습니다 . ID가 비어 있지 않으면 ID를 인쇄하고 기록으로 건너뜁니다.substr($0, 2)
>next

1현재 레코드(시퀀스 또는 일치하지 않는 ID)를 인쇄합니다 .

답변2

awk -F'\t' '
    NR==FNR { map[">"$1] = ">"$2; next }
    $0 in map { $0 = map[$0] }
    { print }
' mapfile fastafile

관련 정보