Verificando se o número de caracteres no arquivo é divisível por 3

Verificando se o número de caracteres no arquivo é divisível por 3

Estou tentando verificar se o número de caracteres base de nucleotídeos em meu arquivo de DNA é múltiplo de 3 e tenho o seguinte código que continua me dando erro:

var4=$(wc -c < $1 | bc)
var5=$($var4 % 3)

if [ "$var5" -eq 0 ]; then

Como você pode ver o código acima não está completo mas estou apenas mostrando a parte onde estou tendo um problema.

Responder1

Supondo que seus nucleotídeos sejam codificados usando as letras do grupo acgtn, o comando a seguir excluirá tudo que não seja um caractere desse grupo (por exemplo, novas linhas e espaços etc.) e então contará os caracteres restantes:

ncount=$( tr -d -c 'acgtn' <"$1" | wc -c )

Você pode então verificar esse número com um teste simples, mas observe o uso de $((...))em vez de $(...):

if [ "$(( ncount % 3 ))" -eq 0 ]; then
    echo 'nucleotide count is multiple of 3'
fi

Se você usar letras maiúsculas ou uma mistura das duas, estenda a string usada tradequadamente.

Responder2

Para remover todos os caracteres que não sejam de nova linha em grupos de três, podemos fazer:

sed 's/...//g' file

Se o resultado for apenas linhas vazias, todas as linhas terão múltiplos de três caracteres.

Se a entrada não for uma linha e puder conter outros caracteres (incluindo novas linhas), remova qualquer coisa que não seja caracteres de base de nucleotídeos (assumindo letras maiúsculas ACGTN), incluindo as novas linhas:

{ <file tr -cd 'ACGTN'; echo; } | sed 's/...//g'

Se o resultado estiver vazio (apenas uma nova linha), a contagem de caracteres base será múltiplo de 3.

Supondo que você queira parar o script (sair) se a contagem não for múltipla de 3, use isto:

if [ "$( { <file tr -cd 'ACGTN'; echo; } | sed 's/...//g')" ]; then
    echo 'nucleotide count is not multiple of 3'
    exit 1
fi

Responder3

Uma sedopção

f=$(sed -E "s/[actgn]{3}//g" file); echo ${#f}

Apenas exclua todos os grupos válidos contíguos de 3 bases e se você tiver algo diferente de uma string de comprimento zero no final, então você terá um problema... embora isso permita novas linhas, desde que a quebra seja um múltiplo de 3 bases.

Responder4

Usando bash,GNU grepe wc, mas sem variáveis:

(exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) )

...que retorna umverdadeirocódigo de saída somente se os caracteres de DNA forem múltiplos de três.

Usar isso no código pode ser parecido com:

if (exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) ); then

informação relacionada