Contando códons de DNA em arquivo de DNA

Contando códons de DNA em arquivo de DNA

Quero criar um script bash que receba um arquivo de DNA e verifique se ele não possui caracteres de nova linha ou espaços em branco e, em seguida, produza os códons exclusivos junto com a contagem do número de vezes que eles ocorrem. Usei o código a seguir, mas o códon continua me dando uma saída de "bash-3.2$". Estou muito confuso se minha sintaxe está errada e por que não estou obtendo a saída adequada.

! /bin/bash

for (( pos=1; pos < length - 1; ++pos )); do
    codon = substr($1, $pos, 3)
    tr-d '\n' $1 | awk -f '{print $codon}' | sort | uniq -c
done

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

 $script dnafile              
 aac 3
 acg 2
 ttt 1

Responder1

Você obtém essa saída porque a primeira linha do seu script inicia um novo bashshell.

Essa linha deveria ser lida

#!/bin/bash

(observe o #no início).

Você então mistura awksintaxe com código shell de uma maneira que nunca funcionará.

Em vez disso, mantenha a simplicidade e divida seu arquivo em grupos de três caracteres, classifique-os e conte quantos caracteres exclusivos você obtém:

$ fold -w 3 dnafile | sort | uniq -c
   3 aac
   2 acg
   1 ttt

Isso funcionaria desde que a entrada sempre contivesse um múltiplo de três caracteres, sem espaços incorporados ou outros caracteres.

Responder2

(echo aacacgaactttaacacg ;echo aacacgaactttaacacg ) |
  perl -ne '# Split input into triplets (A3)
            # use each triplet as key in the hash table count
            #   and increase the value for the key
            map { $count{$_}++ } unpack("(A3)*",$_);
            # When we are at the end of the file
            END{ 
                 # Remove the key "" (which is wrong)
                 delete $count{""};
                 # For each key: Print key, count
                 print map { "$_ $count{$_}\n" } keys %count
            }'

Responder3

awkUma versão um pouco mais prolixa

awk 'BEGINFILE{print FILENAME; delete codon}
     ENDFILE {
     if (NR!=1 || NF!=1 || length($0)%3!=0){
         print "is broken"}
     else{
         for (i=1; i<=length($0); i+=3) codon[substr($0,i,3)]++}; 
         for (c in codon) print c, codon[c]; 
         print ""}' file*

Para esta entrada

arquivo1: OK

aacacgaactttaacacg

arquivo2: espaço

aacacgaact ttaacacg

arquivo3: quebra de linha

aacacgaact
ttaacacg

file4: não é um múltiplo de 3 bases

aacacgaactttaacac

Você consegue

file1
aac 3
ttt 1
acg 2

file2
is broken

file3
is broken

file4
is broken

Se você deseja apenas reparar os arquivos e não tem nenhum como, file4então catseus arquivos passam trde uma ponta awkou de outra, assim como no seu exemplo

<<< $(cat file[1..3] | tr -d "\n ")

informação relacionada