{ "cells": [ { "cell_type": "markdown", "id": "cc3a69f4-f804-4564-a0df-b6baa1551386", "metadata": {}, "source": [ "#
Pontificia Universidad Católica del Ecuador
\n", "##
Maestría Virtual en Biología Computacional
\n", "###
Programación para las ciencias biológicas
\n", "####
BASH
\n", "
Charles Escobar
\n", "
2024
\n", "\n", "**Nombre del estudiante:** " ] }, { "cell_type": "markdown", "id": "2a6deee2-1f5b-4183-baba-c286cdbdf353", "metadata": {}, "source": [ "# **\"Estructuras de programación con BASH y conexiones remotas SSH\"**\n", "\n", "**¿Qué esperamos aprender en esta libreta?**\n", "\n", "En esta libreta de trabajo, vamos a explorar los siguientes temas:\n", "\n", "* Conocer como se estructuras de programación en BASH\n", "* Conocer cómo realizar una conexión remota usando SSH\n", "\n", "BASH es un lenguaje interpretado a través del terminal y permite programación estructurada a través de:\n", "\n", "* Bloques de código\n", "* Condicionantes\n", "* Bucles iterativos\n", "* Llamadas a subprogramas\n", "\n", "`Bloques de código`: La programación en BASH permite la generación de bloques de código legibles y fiables, de tal manera que sea sencilla la codificación y mantenimiento de los scripts.\n", "\n", "```bash\n", "#!/bin/bash\n", "#PROGRAMA: holamundo.sh\n", "#Objetivo: Imprimir \"Hola mundo\" en el terminal\n", "#Entradas: No requiere\n", "#Salidas: Texto \"Hola mundo\"\n", "#\n", "#Autor: Nombre del autor\n", "#Fecha: 26/05/2021\n", "#Licencia: GNU/GPL v3\n", "var1=$1\n", "var2=\"Hola, bienvenido\"\n", "echo $var2 $var1 \n", "exit 0\n", "```\n", "\n", "`Condicionantes`\n", "\n", "Los condicionantes permiten ejecutar diferentes bloques de código dependiendo de si una condición es verdadera o falsa y se implementan principalmente con las estructuras if, elif, else, y operadores lógicos (&&, ||, etc.).\n", "\n", "`if`\n", "```bash\n", "if [ -f sampledata/t-coffee/sproteases_small_dna.fasta ]; then\n", " echo \"El archivo existe.\"\n", "else\n", " echo \"El archivo no existe.\"\n", "fi\n", "```\n", "\n", "`Bucles iterativos`\n", "\n", "Los bucles iterativos permiten ejecutar repetidamente un bloque de código mientras una condición sea verdadera o sobre una lista de elementos.\n", "\n", "* for: Itera sobre una lista o un rango.\n", "* while: Repite mientras una condición sea verdadera.\n", "* until: Repite hasta que una condición sea verdadera.\n", "\n", "`for`\n", "\n", "```bash\n", "for fasta in sampledata/t-coffee/*fasta; do\n", " echo \"Archivo fasta: $fasta\"\n", "done\n", "```\n", "\n", "`while`\n", "\n", "```bash\n", "contador=1\n", "while [ $contador -le 5 ]; do\n", " echo \"Contador: $contador\"\n", " ((contador++)) # Incrementa el contador\n", "done\n", "```\n", "\n", "`until`\n", "\n", "Es una estructura de control que se utiliza para repetir un bloque de comandos hasta que una determinada condición se vuelva verdadera.\n", "\n", "Sintaxis:\n", "\n", "```bash\n", "contador=1\n", "until [ $contador -gt 5 ]; do\n", " echo \"Contador: $contador\"\n", " ((contador++)) # Incrementa el contador\n", "done\n", "```\n", "\n", "`Llamadas a subprogramas (Funciones)`\n", "\n", "Son bloques de código reutilizables que realizan una tarea específica, para declararlas se usa la palabra clave `function` seguida del nombre de la función, esto permite modularizan el código, facilitando la lectura, mantenimiento y reutilización.\n", "Ejemplo:\n", "\n", "```bash\n", "function saludar {\n", " echo \"Hola, mundo!\"\n", "}\n", "\n", "saludar\n", "```\n", "\n", "\n", "\n", "| Bucle | Se ejecuta mientras... | Se detiene cuando... | Uso recomendado |\n", "|--------|---------------------------------------------|----------------------------------------|----------------------------------|\n", "| `for` | Hay elementos en una lista o un rango | Se recorre toda la lista o rango | Iteraciones fijas y conocidas |\n", "| `while`| La condición es **verdadera** | La condición se vuelve falsa | Iteraciones basadas en condiciones |\n", "| `until`| La condición es **falsa** | La condición se vuelve verdadera | Esperar a que ocurra algo |\n", "\n" ] }, { "cell_type": "markdown", "id": "c0ed7b2f-4451-4661-9f48-48a09eb547f2", "metadata": {}, "source": [ "##### `Ejemplo con FOR`\n", "\n", "*Buscar secuencias*\n", "\n", "El siguiente ejemplo muestra como buscar una secuencia en un conjunto de archivos usando `for`, `if` y `grep`\n", "\n", "Estas instrucciones buscan la secuencia \"AGCT\" en todos los archivos *.fasta dentro de la carpeta sampledata/t-coffee/.\n", "\n", "Para cada archivo:\n", "\n", "Si la secuencia está presente, imprime un mensaje indicando que fue encontrada. \n", "Si no está presente, informa que no se encontró. \n" ] }, { "cell_type": "code", "execution_count": null, "id": "400f12b2-61b8-4f33-a49c-16dd240ea423", "metadata": { "scrolled": true }, "outputs": [], "source": [ "for archivo in sampledata/t-coffee/*.fasta; do\n", " if grep -i \"AGCT\" \"$archivo\"; then\n", " echo \"Secuencia encontrada en $archivo\"\n", " else\n", " echo \"Secuencia no encontrada en $archivo\"\n", " fi\n", "done" ] }, { "cell_type": "markdown", "id": "d01bbde5-bb53-4000-bf8c-0166b93c9742", "metadata": {}, "source": [ "#### Desglose línea por línea:\n", "\n", "`for archivo in sampledata/t-coffee/*.fasta; do`\n", "\n", "Este es un bucle for que itera sobre todos los archivos con extensión .fasta ubicados en la carpeta sampledata/t-coffee/.\n", "La variable archivo toma el nombre de cada archivo encontrado en la ruta especificada.\n", "\n", "`if grep -iq \"AGCT\" \"$archivo\"; then`\n", "\n", "grep es un comando que busca patrones de texto dentro de archivos.\n", "\n", "La opción `-i` hace la búsqueda insensible a mayúsculas y minúsculas, es decir, buscará \"AGCT\", \"agct\", \"AgCt\", etc.\n", "\n", "La opción `-q` suprime la salida estándar, es decir, no muestra coincidencias en la terminal, solo devuelve un código de salida (0 si encuentra la secuencia, 1 si no la encuentra).\n", "\n", "Si la secuencia \"AGCT\" se encuentra en el archivo, la condición del if será verdadera.\n", "\n", "`echo \"Secuencia encontrada en $archivo\"`\n", "\n", "Si se encuentra la secuencia \"AGCT\" en el archivo, se muestra un mensaje indicando que se ha encontrado en el archivo correspondiente.\n", "\n", "`else`\n", "\n", "Si la condición anterior no se cumple (es decir, la secuencia no está presente en el archivo), se ejecutará el bloque else.\n", "\n", "`echo \"Secuencia no encontrada en $archivo\"`\n", "\n", "Se muestra un mensaje indicando que la secuencia no fue encontrada en el archivo.\n", "\n", "`done`\n", "\n", "Finaliza el bucle for después de procesar todos los archivos .fasta." ] }, { "cell_type": "markdown", "id": "e071e258-7184-4889-8d4b-0ce58a45211f", "metadata": {}, "source": [ "##### `Ejemplo con FOR`\n", "\n", "*Imprimir nombres de secuencias de archivos .fasta*\n", "\n", "Las siguientes instrucciones iteran sobre todos los archivos .fasta en la carpeta sampledata/t-coffee/.\n", "\n", "Para cada archivo, muestra un mensaje indicando que está procesándolo.\n", "\n", "Luego, utiliza bioawk para extraer e imprimir los nombres de las secuencias presentes en el archivo.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "9d05a873-2614-4839-9974-e5e069be83d8", "metadata": { "scrolled": true }, "outputs": [], "source": [ "for archivo in sampledata/t-coffee/*.fasta; do\n", " echo \"Procesando el archivo $archivo\"\n", " # Realizar procesamiento, por ejemplo, imprimir los nombres de las secuencias\n", " bioawk -c fastx '{print $name}' \"$archivo\"\n", "done" ] }, { "cell_type": "markdown", "id": "d0188190-4743-4eee-a0a4-25771ba6afc8", "metadata": {}, "source": [ "Desglose línea por línea:\n", "\n", "`for archivo in sampledata/t-coffee/*.fasta; do`\n", "\n", "Se inicia un bucle for que itera sobre todos los archivos con la extensión .fasta ubicados en la carpeta sampledata/t-coffee/.\n", "La variable archivo toma el nombre de cada archivo encontrado en la ruta especificada.\n", "\n", "`echo \"Procesando el archivo $archivo\"`\n", "\n", "Imprime un mensaje en la terminal indicando que se está procesando el archivo actual, donde **\\$archivo** se sustituye por el nombre del archivo correspondiente en cada iteración.\n", "\n", "`bioawk -c fastx '{print $name}' \"$archivo\"`\n", "\n", "Realiza el procesamiento del archivo FASTA utilizando la herramienta bioawk. bioawk es una extensión de awk especializada en formatos bioinformáticos como FASTA, FASTQ, GFF, entre otros.\n", "\n", "La opción `-c fastx` le indica a bioawk que interprete el archivo como un formato de secuencia biológica (FASTA o FASTQ).\n", "\n", "`'{print $name}'` es una instrucción de awk que imprime el nombre de cada secuencia en el archivo.\n", "\n", "En archivos FASTA, el nombre de la secuencia es el identificador que sigue al símbolo >.\n", "En archivos FASTQ, el nombre de la secuencia es la línea de encabezado.\n", "\n", "`\"$archivo\"` hace referencia al archivo que se está procesando en la iteración actual.\n", "\n", "`done`\n", "\n", "Finaliza el bucle for después de haber procesado todos los archivos .fasta.\n" ] }, { "cell_type": "markdown", "id": "ba14b99e-12c8-4d1c-9862-3d396511481c", "metadata": {}, "source": [ "##### `Ejemplo con WHILE para encontrar patrones de secuencias`\n", "\n", "Busca línea por línea la existencia del patrón de secuencia \"AGCT\", donde si se encuentra la secuencia, se muestra un mensaje con el número de línea y el contenido correspondiente. \n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "id": "48d4b10f-f374-4541-8cb5-251759ec8f68", "metadata": { "scrolled": true }, "outputs": [], "source": [ "lineas=$(cat sampledata/t-coffee/sample_dnaseq1.fasta|wc -l)\n", "linea=1\n", "while [[ linea -le $lineas ]]; do\n", " \n", " if [[ $(sed -n \"$linea\"p sampledata/t-coffee/sample_dnaseq1.fasta|grep -i \"AGCT\") ]]; then\n", " echo \"la secuencia AGCT se encontró en la línea $linea\"\n", " sed -n \"$linea\"p sampledata/t-coffee/sample_dnaseq1.fasta|grep -i \"AGCT\"\n", " fi\n", " ((linea+=1))\n", "\n", "done" ] }, { "cell_type": "markdown", "id": "8dea2ba9-c78a-4888-9514-e298fa323405", "metadata": {}, "source": [ "Desglose línea por línea:\n", "\n", "`lineas=$(cat sampledata/t-coffee/sample_dnaseq1.fasta | wc -l)`\n", "\n", "`cat sampledata/t-coffee/sample_dnaseq1.fasta` muestra el contenido del archivo. \n", "`wc -l` cuenta el número total de líneas en el archivo. \n", "\n", "El resultado se almacena en la variable `lineas`, indicando cuántas líneas tiene el archivo FASTA.\n", "\n", "`linea=1`\n", "\n", "Inicializa la variable linea con el valor 1, que servirá como contador para recorrer línea por línea el archivo.\n", "\n", "`while [[ linea -le $lineas ]]; do`\n", "\n", "Se inicia un bucle while que continuará ejecutándose mientras el número de la línea actual (linea) sea menor o igual al total de líneas del archivo (lineas).\n", "\n", "`if [[ $(sed -n \"$linea\"p sampledata/t-coffee/sample_dnaseq1.fasta | grep -i \"AGCT\") ]]; then` \n", "`sed -n \"$linea\"p sampledata/t-coffee/sample_dnaseq1.fasta:` \n", "\n", "Extrae la línea número \"$linea\" del archivo FASTA.\n", "\n", "`grep -i \"AGCT\"`\n", "\n", "Busca la secuencia \"AGCT\" de manera insensible a mayúsculas y minúsculas (-i). \n", "Si la línea contiene la secuencia, la condición se evalúa como verdadera y se ejecuta el bloque then. \n", "\n", "`echo \"la secuencia AGCT se encontró en la línea $linea\"` \n", "\n", "Muestra un mensaje indicando que la secuencia \"AGCT\" se encontró en la línea actual.\n", "\n", "`sed -n \"$linea\"p sampledata/t-coffee/sample_dnaseq1.fasta | grep -i \"AGCT\"`\n", "\n", "Se vuelve a imprimir la línea donde se encontró la secuencia para mostrar el contenido exacto.\n", "\n", "`((linea+=1))`\n", "\n", "Incrementa la variable linea en 1 para avanzar a la siguiente línea del archivo.\n", "\n", "`done`\n", "\n", "Finaliza el bucle while cuando se han revisado todas las líneas.\n" ] }, { "cell_type": "markdown", "id": "78744cab-2c5c-4294-a326-92108a73a277", "metadata": {}, "source": [ "## Conexiones remotas con BASH\n", "Por lo general los datos de grandes cadenas de ADN o ARN suelen almacenarse de manera centralizada en servidores de alto desempeño.\n", "Las conexiones remotas traen un terminal remoto bash o sh del servidor al usuario, en la mayoría de los casos la conexión remota se realiza solo a nivel de terminal sin entorno gráfico, de allí la importancia de conocer el terminal y sus comandos para bioinformática.\n", "\n", "\n", "`Open SSH para conexiones remotas` \n", "\n", "Para conexiones remotas encriptadas se lo hace a través de la herramienta openssh.\n", "* En el servidor debe estar habilitado openssh-server.\n", "* En el cliente debe estar instalado ssh, el cual viene por defecto en la mayoría de distribuciones.\n", "* Quienes vienen del mundo de windows pueden sentirse mas cómodos con putty o la terminal de windows CMD.\n", "* Putty es un cliente remoto, sin embargo aunque se puede usar desde GNU/Linux no es necesario.\n", "\n", "`Cómo conetarse remotamente desde BASH`\n", "\n", "Para conectarse remotamente necesita el nombre o dirección IP del servidor y sus credenciales de usuario, por ejemplo:\n", "\n", "**ssh usuario@servidor.net**\n", "\n", "**ssh usuario@IP_del_Servidor**\n", "\n", "Sus credenciales son su usuario y su contraseña, los mismos que le serán entregados en el curso.\n", "\n", "`Cómo copiar un archivo desde el cliente y el servidor con SCP`\n", "\n", "Para copiar archivos entre el cliente y el servidor remoto con las mismas credenciales de SSH se puede usar scp, la sintaxis es la siguiente:\n", "\n", "**scp **\n", "\n", "Para copiar desde el usuario al servidor:\n", "\n", "**scp /ruta/al/archivo usuario@servidor:/ruta/en/el/servidor**\n", "\n", "Para copiar desde el servidor al usuario:\n", "\n", "**scp usuario@servidor:/ruta/en/el/servidor /ruta/al/archivo**\n", "\n", "`Putty`\n", "\n", "Para entornos windows puede descargar putty desde este enlace:\n", "\n", "https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html\n", "\n", "y este ejecutable:\n", "\n", "https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n", "\n", "Para entornos GNU/Linux ejecute:\n", "\n", "sudo apt install putty\n", "\n" ] }, { "cell_type": "markdown", "id": "16eb7afe-725e-41b2-bfeb-8949113102b6", "metadata": {}, "source": [ "## Tarea \n", "\n", "### 1. Práctica\n", "Con el mismo archivo que estamos trabajando extraiga la secuencia del descriptor *\">sp|P03953|CFAD_MOUSE\"* y:" ] }, { "cell_type": "markdown", "id": "5c0bc554-92a7-4e7c-a72d-d1c69243377c", "metadata": {}, "source": [ "#### 1. Modifique la instrucción\n", "\n", "```bash\n", "for archivo in sampledata/t-coffee/*.fasta; do\n", " if grep -q \"AGCT\" \"$archivo\"; then\n", " echo \"Secuencia encontrada en $archivo\"\n", " else\n", " echo \"Secuencia no encontrada en $archivo\"\n", " fi\n", "done\n", "```\n", "\n", "Da tal manera que dentro de la carpeta `sampledata/peptide_seqs/seqs_for_alignment` muestre los archivos cuya secuencia contenga la combinación de proteínas \"MKT\" (Metionina-Lisina-Treonin)" ] }, { "cell_type": "code", "execution_count": null, "id": "512a7034-95e5-4919-90f1-3c663a9fbb93", "metadata": {}, "outputs": [], "source": [ "# Código y respuesta" ] }, { "cell_type": "markdown", "id": "31248ff0-7681-4f46-b021-db15994112ae", "metadata": {}, "source": [ "#### 2. Usando `FOR` y un contador cuente cuantos archivos fasta tiene la carpeta sampledata/t-coffee/. Es obligatorio el uso de estas estructuras de programación" ] }, { "cell_type": "code", "execution_count": null, "id": "c949032b-1ff8-4cc0-b1f5-80c0a5e0d68a", "metadata": {}, "outputs": [], "source": [ "# Código y respuesta" ] }, { "cell_type": "markdown", "id": "8dc2cde3-5fb1-4f81-b08b-57be9aed9d72", "metadata": {}, "source": [ "### 2. Cuestionario\n", "\n", "Conteste las siguientes preguntas" ] }, { "cell_type": "markdown", "id": "cd6ee19e-f1bd-48c2-9a09-96d96d9a80a4", "metadata": {}, "source": [ "#### 2.1. En BASH, ¿cuál es la diferencia entre `FOR` y `WHILE`?" ] }, { "cell_type": "markdown", "id": "eafb90a2-e69f-40e4-aa9f-3e9fffc26f3c", "metadata": {}, "source": [ "ponga aquí su respuesta" ] }, { "cell_type": "markdown", "id": "183f4dba-97a8-414d-b1d5-0db21a6674c2", "metadata": {}, "source": [ "#### 2.2. Usando BASH, ¿Cuándo usaría `UNTIL`?" ] }, { "cell_type": "markdown", "id": "6fb2473f-c95c-4436-9ea9-e8258accd070", "metadata": {}, "source": [ "ponga aquí su respuesta" ] }, { "cell_type": "markdown", "id": "059d0f2e-003c-4c7c-9318-e08f01c71e04", "metadata": {}, "source": [ "# Conclusiones y Recomendaciones\n", "\n", "Una vez ejecutado este cuaderno de trabajo y seguido las instrucciones que en el se detallan, desarrolle por lo menos tres conclusiones y recomendaciones delimitadas exclusivamente a las actividades ejecutadas en este cuaderno de trabajo." ] }, { "cell_type": "markdown", "id": "f794f0d0-b583-42a8-ab0b-3caf6c58860f", "metadata": {}, "source": [ "## Conclusiones\n", "1. Conclusión 1\n", "2. Conclusión 2\n", "3. Conclusión 3" ] }, { "cell_type": "markdown", "id": "b300a9e8-dfb2-47f1-b2b4-5768889dcefd", "metadata": {}, "source": [ "## Recomendaciones\n", "1. Recomendación 1\n", "2. Recomendación 2\n", "3. Recomendación 3" ] }, { "cell_type": "markdown", "id": "b66302a9-89cb-464e-873d-d6f94bd23c85", "metadata": {}, "source": [ "|RÚBRICA Y CRITERIOS DE EVALUACIÓN |||||\n", "|:-|:-:|:-:|:-:|:-|\n", "|PARÁMETROS|100%|50%|0%|Total parcial|\n", "|Desempeño en el desarrollo del cuaderno de trabajo (toma de datos, realización de cálculos, ejecución de comandos, realización de programas, obtención de resultados, obtención de un producto, aplicación de una herramienta, realización de un procedimiento para experimento, etc.)|El estudiantes demuestra solvencia al desempeñarse durante la práctica|El estudiante demuestra parcialmente solvencia al desempeñarse durante la práctica |El estudiante no demuestra solvencia al desempeñarse durante la práctica |40%|\n", "|Cuestionario|El estudiante contesta el cuestionario de forma correcta |El estudiante contesta la mitad del cuestionario de forma correcta|El estudiante contesta el cuestionario de forma incorrecta|30%|\n", "|Conclusiones y Recomendaciones|Todas las conclusiones son adecuadas, objetivas y aplicables exclusivamente a la práctica|Las conclusiones son parcialmente adecuadas, objetivas y aplicables|Las conclusiones no son adecuadas, objetivas y aplicables|30%|\n", "|TOTAL||||100%|" ] } ], "metadata": { "kernelspec": { "display_name": "Bash", "language": "bash", "name": "bash" }, "language_info": { "codemirror_mode": "shell", "file_extension": ".sh", "mimetype": "text/x-sh", "name": "bash" } }, "nbformat": 4, "nbformat_minor": 5 }