7  Scripts en Bash

Los scripts son archivos de texto que contienen instrucciones ejecutables por un intérprete de un lenguaje de programación para la ejecución de tareas. El formato .sh se utiliza para escribir scripts ejecutables por un intérprete como Bash. En esta sección crearemos varios scripts de Bash y usaremos varios comandos y operadores.

Note

Los script de Bash contiene al inicio esta descripción #!bin/bash y la extensión .sh

7.1 Actividad grupal

Paso 1. Crear un script en Bash con el nombre demo.sh empleando nano.

nano demo.sh

Paso 2. Copia el siguiente código dentro del script demo.sh y guarda los cambios.


#!/bin/bash
# File: demo.sh

# Input de archivo
# 2. Mostrar el archivo y número de argumentos
echo "Archivo a procesar > $@"
echo "Numero de argumentos: $#"

# 3. Conteo de secuencias y separación de malas lecturas
numero_secuencias=$(grep -c '^@SRR098026' $@)
grep -B1 -A2 NNNNNNNNNN $@ > malas_lecturas.fastq
malas=$(cat malas_lecturas.fastq | wc -l)
echo "Número de malas lecturas: $malas"

# 4. Búsqueda de patrones
echo "Desea buscar patrones (y/n): "
read d

if [[ $d == "y" ]]; then
    echo "Los patrones se guardarán en: patrones.txt"
    echo -e 'ACTG\nCCCCC\nNNNCNNN\nNNNGNNN\nTTTT\nTATA\nAAA' > patrones.txt
    grep -f patrones.txt $@ > busqueda.txt
    echo "Búsqueda de patrones guardada en: busqueda.txt"
else
    echo "ok :P"
fi

# Mensaje final
echo "Fin :)"
  • 1. Comentarios y declaración de archivo

  • #!/bin/bash: Indica que el script se ejecutará usando el intérprete de Bash.

  • # File: demo.sh: Un comentario que indica el nombre del archivo del script.

  • 2. Mostrar el archivo y número de argumentos

  • echo "Archivo a procesar > $@": Muestra el nombre del archivo que se pasará como argumento al script. $@ representa todos los argumentos pasados al script.

  • echo "Numero de argumentos: $#": Muestra cuántos argumentos ha recibido el script. $# indica el número de argumentos.

  • 3. Contar secuencias y separar malas lecturas

  • numero_secuencias=$(grep -c '^@SRR098026' $@): Usa grep para contar cuántas secuencias empiezan con @SRR098026 en el archivo (probablemente sea un prefijo en un archivo FASTQ que identifica secuencias de interés). -c cuenta las coincidencias.

  • grep -B1 -A2 NNNNNNNNNN $@ > malas_lecturas.fastq: Busca secuencias de calidad baja o problemáticas (que contengan 10 nucleótidos seguidos de N, que representan bases no determinadas).

    • -B1: Muestra 1 línea antes de cada coincidencia de NNNNNNNNNN.

    • -A2: Muestra 2 líneas después de la coincidencia.

    • El resultado se guarda en un archivo llamado malas_lecturas.fastq.

  • malas=$(cat malas_lecturas.fastq | wc -l): Cuenta el número total de líneas en malas_lecturas.fastq (esto indica la cantidad de malas lecturas encontradas).

  • echo "Número de malas lecturas: $malas": Muestra la cantidad de malas lecturas encontradas

  • echo "Numero de argumentos: $#": Muestra cuántos argumentos ha recibido el script. $# indica el número de argumentos.

  • 4. Búsqueda de patrones

  • echo "Desea buscar patrones (y/n): ": Pregunta al usuario si desea buscar patrones específicos en el archivo.

  • read d: Lee la respuesta del usuario y la guarda en la variable d.

  • if [[ $d == "y" ]]; then: Si la respuesta es “y” (sí), el script procede a buscar los patrones.

    • echo -e 'ACTG\nCCCCC\nNNNCNNN\nNNNGNNN\nTTTT\nTATA\nAAA' > patrones.txt: Crea un archivo patrones.txt que contiene una lista de secuencias de interés (patrones a buscar).

    • grep -f patrones.txt $@ > busqueda.txt: Busca los patrones contenidos en patrones.txt dentro del archivo de entrada. El resultado de la búsqueda se guarda en busqueda.txt.

    • echo "Búsqueda de patrones guardada en: busqueda.txt": Informa al usuario que los resultados de la búsqueda se guardaron en el archivo busqueda.txt.

  • else: Si la respuesta es “n” (no), simplemente muestra un mensaje.

Este código realizará las siguientes instrucciones:

  1. Tomará como input el nombre del archivo ./_files/secuencias_bash.fastq de secuencias fastq para analizar.

  2. Buscará dentro del archivo provisto por el usuario las secuencias con el string @SRR098026 y las contará.

  3. Exportará las malas secuencias a un archivo llamado malas_lecturas.fastq, usando el string “NNNNNNNNNN” como plantilla.

  4. Reportará el número de malas secuencias.

  5. Luego buscaremos patrones en el archivo buenas_lecturas.fastq, si es que el usuario lo desea.

Paso 3. Deberías correr el script así, una vez que hayas descargado el archivo secuencias_bash.fastq:

bash demo.sh secuencias_bash.fastq

7.2 Repaso

Ahora que ya sabes realizar Script en Bash, podrias intentar realizar la actividad de 6. Extracción de información de archivos fastq del curso de GNU/Linuz para Bioinformatica organizado por RSG Ecuador.

7.3 Extracción de información de archivos fastq

En este ejercicio se obtendrá información de archivos fastq, que cotienen secuencias de nucleótidos y la calidad de su proceso de secuenciación. Para esto usaremos los archivos secuencias1.fastq, secuencias2.fastq y secuencias3.fastq que se encuentra en la carpeta _files dentro del directorio raíz del repositorio de GitHub unix.bioinfo.rsgecuador .

Ejercicio 6.1 La letra N representa un nucleótido que no pudo ser leído correctamente, y se reporta como ninguno, o missing data. Imprime el número de secuencias que tenga diez N seguidas por cada uno de los archivos fastq de la carpeta _files.

Note

Es posible realizar esto con un comando de una sola línea, intenta resolverlo de esta forma.

# cd C:/Users/ecoss/Documents/Respaldos/Github_notes/Workshop_Bash2024/data/unix.bioinfo.rsgecuador-gh-pages

#!/bin/bash
# File: countseq.sh

# Ruta a la carpeta que contiene los archivos .fastq
FOLDER="_files"

# Iterar sobre cada archivo .fastq en la carpeta
for file in "$FOLDER"/*[1-3].fastq; do
  # Imprimir el nombre del archivo
  echo "Archivo: $file"
  
  # Usar grep para buscar secuencias que contengan 10 'N' seguidas y contar cuántas veces aparecen
  count=$(grep -c 'NNNNNNNNNN' $file )
  
  # Imprimir el número de secuencias encontradas
  echo "Número de secuencias con 10 N seguidas: $count"
  echo "---------------------------------------"
done

Recuerda para ejecutar este codigo deberas encontrarte dentro de la carpeta descomprimida unix.bioinfo.rsgecuador-gh-pages/y ejecutar: ./countseq.sh.

Salida:

  • secuencias1.fastq - 1
  • secuencias2.fastq - 58
  • secuencias3.fastq - 75

Ejercicio 6.2 Ahora, determina el número de secuencias (lineas) de cada archivo .fastq por separado. Se conoce que los títulos de las corridas de las secuencias en cada archivo .fastq empiezan con el string @SRR098026.

#!/bin/bash
# File: countNseq.sh

# Ruta a la carpeta que contiene los archivos .fastq
FOLDER="_files"

# Iterar sobre cada archivo .fastq en la carpeta
for file in "$FOLDER"/*[1-3].fastq; do
  echo "Archivo: $file"
  
  # Usar grep para contar cuántas líneas empiezan con '@SRR098026'
  count=$(grep -c '^@SRR098026' $file )
  
  echo "Número de secuencias: $count"
  echo "---------------------------------------"
done

Salida:

  • secuencias1.fastq - 99
  • secuencias2.fastq - 75
  • secuencias3.fastq - 75

7.4

Material suplementario