Que tipo de dados contém o arquivo de entrada?

2

Eu tenho uma pasta com mais de 10000 arquivos de texto. Os arquivos podem ser de dois tipos:

Type1: chamado de "DNA"

Formato:

informações do cabeçalho começando com “>”

A linha 2 em diante contém apenas as seguintes letras: "A", "T", "G", "C", "N"

Exemplo:

Nome do arquivo: "ABC123.tab"

  >DNA1_example
  TGTTGTTGTTGTTGCTGCTGTTGTTGCTGCTGTTGTTGTTGTTGTTGCTGCTGTTGTTGTTGTTGTTGCTGCTGCTGTTGTTGCTGTTGTCTTTGAGGTTGGAGATTAGGACGATTCGGCATGTTGTTGTTCCATGATCCGATCCCAACACCAGGACTAGGCTGTCCTTGCAAACTGATACCGGGACTCGATCTGGCACCAACTCCTGGCTGCGGAGAAAGTTGGGATCCGTGTTGTTGTTGTTGAAAACCTTGTGGAGGTGGTCCTATGCGAGGCGACACTTGAGCCGAATTAAACGGTGATAGCCGAGAAGATGGACCTCCAGGAGCAAAATTATTGCCGTTGTTGTTATTGACAATTTGTGCCTGAGGGCTTTGATTGTAGTTGCCACTATTGGCCGTGCTCAAACTGCTCATCGGACCGTGAGGTGAAAAAGGTGGTTGCATTGGGCGCTGACTGGGGGAGATTTGAGACGCTAGTGGCCCGCTACCTATTGGACTGC

Tipo 2: chamado de "proteína"

Formato:

informações do cabeçalho começando com “>”

A linha 2 em diante contém apenas as seguintes letras: G, A, L, M, F, W, K, Q, E, S, P, V, I, C, A, H, R, N, D, T

Exemplo:

Nome do arquivo: "DEF123.tab"

    >Protein1_example
    MRCVLCYKNIAGNKLARFCVFSTSILLSLLSTQAQLSIIPQDELLAAEKMVNSSRWRLLD

O que eu gostaria de fazer é:

1) Abra o arquivo.

2) Ignore a linha que começa com ">"

3) Verifique se ele contém um desses alfabetos ocorrendo: L, M, F, W, K, Q, E, S, P, V, I, A, H, R, D em outras linhas.

4) Se sim, imprima “Protein”, senão imprima “DNA”

    
por biobudhan 14.11.2016 / 16:03

2 respostas

-1

Incase alguém está interessado no futuro: Aqui está a minha maneira rápida e suja de fazê-lo usando perl:

  #!usr/bin/perl
  use warnings;
  use strict;
  open(FILE, "ABC123.fa");
  my $line_=<FILE>;
   $line_=readline(*FILE) if $line_=~/>/;
  close(FILE);
  if($line_ =~ /L|M|F|W|K|Q|E|S|P|V|I|Y|H|R|D/){
  print "Protein\n"
  }
  else {
   print "Nucleotide\n"
   }

Eu executo usando:

  perl format_tester.pl

antes de executar este código a cada vez, eu apenas substituo "ABC123.fa" para "DEF123.fa" usando a abordagem sed:

    sed -i 's/ABC123.fa/DEF123.fa/g' format_tester.pl
    
por 16.11.2016 / 11:08
0

Usando awk :

for name in folder/*; do
    # skip this name if it's not the name of a file
    [ ! -f "$name" ] && continue

    awk 'NR == 1 && !/^>/ {
             printf("Not a fasta file: %s\n", FILENAME)
             skip=1; exit
         }
         !/^>/ && /[LMFWKQESPVIYHRD]/ {
             printf("Protein fasta file: %s\n", FILENAME)
             skip=1; exit
         }
         END {
             if (!skip) printf("Probably a DNA fasta file: %s\n", FILENAME)
         }' "$name"
done

Isso passa por todos os nomes no diretório chamado folder . Ele ignora os nomes dos subdiretórios (não-arquivos) e aplica um script awk aos arquivos que encontra.

Então

  1. Garante que o arquivo seja um arquivo fasta testando um > no início da primeira linha. Se não houver > no início da primeira linha, ele reportará um erro no arquivo e sairá.

  2. Para cada linha que não começa com > , testa se há um símbolo de proteína na linha. Se houver, ele relata o arquivo como um arquivo fasta de proteína e sai.

  3. No final, se chegarmos lá, é possivelmente um arquivo DNA fasta e o código relata isso. Note que mesmo que seja improvável, ainda pode ser um arquivo de proteínas como os símbolos para os aminoácidos do DNA também fazem parte do conjunto de símbolos da proteína.

A variável skip está definida como 1 quando estamos saindo devido a ter determinado que o arquivo não é um arquivo fasta ou se é um arquivo fasta de proteína. Ao testar essa variável no bloco END , sabemos se chegamos lá devido a um exit inicial ou ao esgotar os dados (nesse caso, provavelmente é um arquivo DNA fasta).

    
por 08.04.2018 / 14:02