Sintaxe para expressão regular procurando códons de DNA

0

Eu tenho que escrever um script para uma atribuição que irá tomar o nome do arquivo como um comando e saída de cada códon único de 3 bases no arquivo e quantas vezes ele ocorre em ordem decrescente. O script tem que verificar se ele tem um argumento e se não exibe uma mensagem de erro. Estou confuso sobre como começar a ti e a sintaxe para a expressão regular que eu precisarei para que o script procure por cada códon único. O ponto é que um arquivo é cheio de nada, mas a repetição de letras de "a" "c" "t" "g" em pedidos aleatórios e o objetivo é escrever um script que será iniciado a partir do início do arquivo e exibir cada Códon de 3 letras e sua contagem, por exemplo aac ou acg.

Por exemplo, se um arquivo chamado dnafile contiver o padrão aacacgaactttaacacg, o script terá a seguinte entrada e saída

$script dnafile              
aac 3
acg 2
ttt 1

e se a verificação de erro mostrar um erro, deve ser script cannot open file dnafile for reading .

    
por Chaudry Osama 28.10.2018 / 21:01

1 resposta

1

Para obter todos os codons completos de um único arquivo:

{
    for (pos = 1; pos < length - 1; ++pos) {
        codon = substr($0, pos, 3)
        print codon
    }
}

Este pequeno script awk simplesmente exibe cada substring de três caracteres de cada linha. Na fala de bioinformática, produz os códons completos para cada quadro, um por vez.

Teste em seus dados:

$ awk -f script.awk <file
aac
aca
cac
acg
cga
gaa
aac
act
ctt
ttt
tta
taa
aac
aca
cac
acg

Você pode classificar e contar o número de vezes que cada códon ocorre:

$ awk -f script.awk <file | sort | uniq -c
   3 aac
   2 aca
   2 acg
   1 act
   2 cac
   1 cga
   1 ctt
   1 gaa
   1 taa
   1 tta
   1 ttt

Se o arquivo contiver novas linhas, primeiro remova-as para conseguir os codons quebrados por novas linhas:

$ cat file
aacacgaactttaacacg
aacacgaactttaacacg
$ tr -d '\n' <file | awk -f script.awk | sort | uniq -c
   6 aac
   4 aca
   4 acg
   2 act
   4 cac
   3 cga
   2 ctt
   3 gaa
   2 taa
   2 tta
   2 ttt

(observe como a contagem de cga e gaa mudou para 3 em vez de para 2)

Se os seus dados forem grandes , você teria que criar outra coisa para lidar com a transição em novas linhas:

{
    $0 = lastbit $0

    for (pos = 1; pos < length - 1; ++pos) {
        codon = substr($0, pos, 3)
        print codon
    }

    lastbit = substr($0, length - 1)
}

Isso salva as duas últimas bases de cada linha em lastbit e as preparam para a próxima linha de sequência.

Executando isso nas mesmas duas linhas de entrada acima:

$ awk -f script.awk <file | sort | uniq -c
   6 aac
   4 aca
   4 acg
   2 act
   4 cac
   3 cga
   2 ctt
   3 gaa
   2 taa
   2 tta
   2 ttt

Se você deseja apenas os codons no primeiro quadro:

{
    $0 = lastbit $0

    for (pos = 1; pos < length - 1; ++pos) {
        if ((pos + length(lastbit)) % 3 == 1) {
            codon = substr($0, pos, 3)
            print codon
        }
    }

    lastbit = substr($0, length - 1)
}

Adicione uma etapa sort -nr extra aos pipelines acima se quiser que a saída seja classificada nas contagens em ordem decrescente.

Veja também:

por 29.10.2018 / 08:36