como concatenar um arquivo com vários cabeçalhos em um

2

Você pode me sugerir como posso combinar?

a.fasta com 10000 sequências com cabeçalhos 1, 2, 3, .... 10000 ....................... em apenas um cabeçalho, por exemplo

>1
AAATTTTGGGGCCC
>2
ACCCCGGGTTT
..........
>10000
ATGCCCCCCCCCC

Saída:

>1
AAATTTTGGGGCCCACCCCGGGTTTATGCCCCCCCCCC
    
por star 10.09.2014 / 14:43

3 respostas

3

awk '
    /^>/ { 
        # print the first header
        if (c++ == 0) {print; print ""} 
        next
    } 
    /^$/ {next} 
    {printf "%s", $0} 
    END {print ""}
' a.fasta > b.fasta

conteúdo do b.fasta

>1

AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
    
por 10.09.2014 / 15:00
2

A maneira mais simples é simplesmente imprimir a primeira linha e depois todas as outras linhas do arquivo que não contiverem i) nenhum caractere de espaços (eles não precisam estar em arquivos fasta) e ii) uma linha de cabeçalho fasta ( > ):

head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' >>  newfile.fa

O head imprime a 1ª linha e a expressão regular grep procura todas as linhas que contenham apenas caracteres não > e não espaciais ( [^> ] ) desde o início ( ^ ) até o final ( $ ) da linha.

No entanto, isso resultará em um arquivo como este:

>1
AAATTTTGGGGCCC
ACCCCGGGTTT
ATGCCCCCCCCCC

Para obter a sequência inteira na mesma linha, use isso:

head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' | tr -d '\n'>>  newfile.fa; 

Você pode adicionar uma nova linha extra ao final do arquivo com

echo "" >> newfile.fa

No entanto, se você estiver trabalhando com esses arquivos, sugiro que salve esses dois scripts em um arquivo em seu $ PATH ( $HOME/bin , por exemplo) e torne-os executáveis ( chmod a+x $HOME/bin/scriptname ):

FastaToTbl

Este script pega um arquivo fasta e o muda para o formato tbl (o cabeçalho fasta, uma aba e depois a sequência, tudo em uma linha):

#! /bin/sh
gawk '{
        if (substr($1,1,1)==">")
        if (NR>1)
                    printf "\n%s\t", substr($0,2,length($0)-1)
        else 
            printf "%s\t", substr($0,2,length($0)-1)
        else 
                printf "%s", $0
}END{printf "\n"}'  "$@"

TblToFasta

Isso faz o inverso, pega um arquivo no formato tbl e o converte em um arquivo fasta correto ( > header e 60 caracteres por linha):

#! /bin/sh

gawk '{
  sequence=$NF

  ls = length(sequence)
  is = 1
  fld  = 1

# if (fld == 1){printf ">"}

  while (fld < NF)
  {
     if (fld == 1){printf ">"}
     printf "%s " , $fld

     if (fld == NF-1)
      {
        printf "\n"
      }
      fld = fld+1
  }

  while (is <= ls)
  {
    printf "%s\n", substr(sequence,is,60)
    is=is+60
  }
}' "$@"

Agora, se você tivesse esses scripts disponíveis, poderia ter feito o que pediu simplesmente executando:

$ head -n 1 file.fa; FastaToTbl file.fa | awk -F"\t" '{print $2}'
>1
AAATTTTGGGGCCC
ACCCCGGGTTT..........
ATGCCCCCCCCCC

Ou, para obter um arquivo fasta correto:

 $ head -n 1 file.fa > newfile; FastaToTbl file.fa | 
    awk -F"\t" '{printf "%s", $2}' | TblToFasta >> newfile   

Que produz:

>1
AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
    
por 10.09.2014 / 16:41
1
{ echo '>1'; tr -dc '[:alpha:]'; } <infile >outfile

Você não precisa obter a primeira linha do arquivo - apenas echo a header. E se você excluir tudo, exceto os caracteres alfabéticos, você só conseguirá o que deseja automaticamente.

    
por 11.09.2014 / 04:30