Comprobando si el número de caracteres en el archivo es divisible por 3

Comprobando si el número de caracteres en el archivo es divisible por 3

Estoy tratando de verificar si la cantidad de caracteres de bases de nucleótidos en mi archivo de ADN es múltiplo de 3 y tengo el siguiente código que sigue dándome error:

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

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

Como puede ver, el código anterior no está completo, pero solo muestro la parte donde tengo el problema.

Respuesta1

Suponiendo que sus nucleótidos están codificados usando las letras del grupo acgtn, el siguiente comando eliminará todo lo que no sea un carácter de ese grupo (por ejemplo, nuevas líneas y espacios, etc.) y luego contará los caracteres restantes:

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

Luego puede verificar este número con una prueba simple, pero tenga en cuenta el uso de $((...))en lugar de $(...):

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

Si usa letras mayúsculas, o una combinación de las dos, extienda la cadena utilizada con trapropiadamente.

Respuesta2

Para eliminar todos los caracteres que no sean de nueva línea en grupos de tres, podemos hacer:

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

Si el resultado son solo líneas vacías, todas las líneas tenían múltiplos de tres caracteres.

Si la entrada no es una línea y puede contener otros caracteres (incluidas las nuevas líneas), elimine todo lo que no sean caracteres de base de nucleótidos (asumiendo que están en mayúsculas ACGTN), incluidas las nuevas líneas:

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

Si el resultado está vacío (solo una nueva línea), el recuento de caracteres base es múltiplo de 3.

Suponiendo que desea detener el script (salir) si el recuento no es múltiplo de 3, utilice esto:

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

Respuesta3

Una sedopción

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

Simplemente elimine todos los grupos válidos contiguos de 3 bases y si le queda algo más que una cadena de longitud cero al final, entonces tiene un problema... aunque esto permitirá nuevas líneas siempre que la ruptura sea un múltiplo de 3 bases.

Respuesta4

Usando bash,ÑU grepy wc, pero sin variables:

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

...que devuelve unverdaderocódigo de salida solo si los caracteres del ADN están en múltiplos de tres.

Usar esto en código podría verse así:

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

información relacionada