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 tr
apropiadamente.
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 sed
opció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 grep
y 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