Substituindo os IDs seq do arquivo fasta com base nos novos IDs de uma lista

Substituindo os IDs seq do arquivo fasta com base nos novos IDs de uma lista

Eu tenho um arquivo fasta e quero substituir os IDs seq (linhas de descrição) por IDs novos e estendidos. Este é o formato do arquivo fasta:

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

e deseja alcançar um novo fasta com o seguinte formato:

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

Isso significa que, por exemplo, o 3C-assembly|contig_74 deve ser substituído por Scaffold_001 [Sex=Female] [Unplaced scaffold]. Para isso, construí um arquivo de texto incluindo duas colunas (delimitadas por tabulação) conectando esses dois 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]
......................

Você tem alguma ideia de como posso usar este arquivo de texto para substituir IDs no meu arquivo fasta. Obrigado

Responder1

Usando awk:

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

Primeiro, leia o arquivo de texto que contém o mapeamento e salve o segundo campo no array ausando o primeiro campo como índice. Pule para o nextregistro.

Em seguida, leia o arquivo fasta. Se o registro começar com >, procure o novo id do array removendo o primeiro caractere do registro atual ( substr($0, 2)) e usando este valor como índice do array.
Se o id não estiver vazio, imprima >o id e pule para o nextregistro.

Imprime 1o registro atual (as sequências ou ids não correspondentes).

Responder2

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

informação relacionada