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 tr
adequadamente.
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 sed
opçã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 grep
e 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