biote-2016 Release O. Maya September 02, 2016 Antes de empezar 1 Índice 1.1 Linux . . . . . . . . . . 1.2 MacOS . . . . . . . . . 1.3 Windows . . . . . . . . 1.4 GNU/Linux . . . . . . . 1.5 Terminal . . . . . . . . 1.6 Entorno . . . . . . . . . 1.7 Preprocesamiento . . . 1.8 Asignación taxonómica 1.9 Asignación funcional . . 1.10 Install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 . 3 . 49 . 52 . 53 . 56 . 76 . 80 . 93 . 98 . 100 i ii biote-2016, Release Este es un curso que me hubiera gustado recibir cuando empecé a usar GNU/Linux en el ámbito bioinformático, especialmente en el análisis de datos “metagenómicos”. Antes de empezar 1 biote-2016, Release 2 Antes de empezar CHAPTER 1 Índice El curso está organizado en las siguientes secciones: • Antes de empezar • Sistema UNIX • Análisis 16S 1.1 Linux Un sistema Linux requiere de al menos tres particiones: • Una partición primaria para el directorio raíz: / • Una partición lógica para el área de intercambio: swap • Y una partición lógica para los archivos: /home 1.1.1 Tipos de particiones Primaria Es la partición necesaria que es necesaria para almacenar y bootear el sistema operativo. Extendida Partición que puede ser subdividida en unidades lógicas y es vista como un contenedor de ellas. No es booteable. Puede ser dividida hasta en 24 particiones lógicas. Lógica Las particiones lógicas son aquellas creadas en la partición extendida. 3 biote-2016, Release Ejemplo Servidor Debian “Amidala”: 1.1.2 Instalación de Ubuntu Bipartición Pasos para instalar Ubuntu en un sistema con Windows: 4 Chapter 1. Índice biote-2016, Release 1.1. Linux 5 biote-2016, Release 6 Chapter 1. Índice biote-2016, Release 1.1. Linux 7 biote-2016, Release 8 Chapter 1. Índice biote-2016, Release 1.1. Linux 9 biote-2016, Release 10 Chapter 1. Índice biote-2016, Release 1.1. Linux 11 biote-2016, Release 12 Chapter 1. Índice biote-2016, Release 1.1. Linux 13 biote-2016, Release 14 Chapter 1. Índice biote-2016, Release 1.1. Linux 15 biote-2016, Release 16 Chapter 1. Índice biote-2016, Release 1.1. Linux 17 biote-2016, Release 18 Chapter 1. Índice biote-2016, Release 1.1. Linux 19 biote-2016, Release 20 Chapter 1. Índice biote-2016, Release 1.1. Linux 21 biote-2016, Release 22 Chapter 1. Índice biote-2016, Release 1.1. Linux 23 biote-2016, Release Nativa Pasos para instalar Ubuntu de manera exclusiva: 24 Chapter 1. Índice biote-2016, Release 1.1. Linux 25 biote-2016, Release 26 Chapter 1. Índice biote-2016, Release 1.1. Linux 27 biote-2016, Release 28 Chapter 1. Índice biote-2016, Release 1.1. Linux 29 biote-2016, Release 30 Chapter 1. Índice biote-2016, Release 1.1. Linux 31 biote-2016, Release 32 Chapter 1. Índice biote-2016, Release 1.1. Linux 33 biote-2016, Release 34 Chapter 1. Índice biote-2016, Release 1.1. Linux 35 biote-2016, Release 36 Chapter 1. Índice biote-2016, Release 1.1. Linux 37 biote-2016, Release 38 Chapter 1. Índice biote-2016, Release 1.1. Linux 39 biote-2016, Release 40 Chapter 1. Índice biote-2016, Release 1.1. Linux 41 biote-2016, Release 42 Chapter 1. Índice biote-2016, Release 1.1. Linux 43 biote-2016, Release 44 Chapter 1. Índice biote-2016, Release 1.1. Linux 45 biote-2016, Release 46 Chapter 1. Índice biote-2016, Release 1.1. Linux 47 biote-2016, Release 1.1.3 Configuración de Ubuntu Descargar y ejecutar el siguiente script: wget --trust-server-names https://goo.gl/cEtm0J chmod +x post_install_ubuntu1604.sh sudo ./post_install_ubuntu1604.sh Aparecerá el siguiente mensaje: # -------------------------------------------------------------# # # # Ubuntu 16.04 LTS Post-installation script - CINVESTAV 2016 # # # # -------------------------------------------------------------# Finishing the installation may take several minutes Do you want to continue (y/n)? Al finalizar tendremos nuestro sistema listo para utilizar. 48 Chapter 1. Índice biote-2016, Release 1.2 MacOS En Mac, el shell está disponible a través de la Terminal en Applications -> Utilities -> Terminal. Arrástrala a tu Dock para fácil acceso. 1.2.1 XCode En la terminal copia y pega el siguiente comando: xcode-select --install Te aparecerá el siguiente mensaje en tu pantalla. Click Install cuando aparezca. “Lee” y acepta el License Agreement ;) 1.2. MacOS 49 biote-2016, Release Una vez que el software esté instalado, Done. ¡Listo! 50 Chapter 1. Índice biote-2016, Release 1.2.2 Homebrew Homebrew es un gestor de paquetes para OS X. Para instalar escribe en una terminal: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" Puedes instalar algunos de los comandos que utilizaremos en este curso: brew install wget htop vim git python XQuartz QIIME para Mac utiliza librerías de XQuartz X11, por lo que es necesario instalarlas. Descarga el paquete XQuartz X11 e instálalo. Dichas librerías proporcionan una versión de X.org X Window System para MacOS. Dependencias de R Descarga e instala el PKG de R. Posteriormente, en Terminal, iniciar R e instalar las dependencias necesarias para MacQIIME. R #inicia la terminal de R install.packages(c('randomForest', 'ape', 'vegan', 'optparse', 'gtools', 'klaR', 'RColorBrewer', 'bio source("http://bioconductor.org/biocLite.R") #define el repositorio de Bioconductor biocLite(c('metagenomeSeq', 'DESeq2')) #instala paquetes de Bioconductor QIIME Para instalar MacQIIME, la versión QIIME para MacOS, es necesario seguir los siguientes pasos: cd $HOME wget ftp://ftp.microbio.me/pub/macqiime-releases/MacQIIME_1.9.1-20150604_OS10.7.tgz tar -xvf MacQIIME_1.9.1-20150604_OS10.7.tgz cd MacQIIME_1.9.1-20150604_OS10.7/ ./install.s && cd .. && rm -r MacQIIME_1.9.1-20150604_OS10.7/ 1.2. MacOS 51 biote-2016, Release 1.3 Windows En Windows, utilizaremos MobaXTerm para explorar la parte correspondiente a Shell. La mayoría de las herramientas utilizadas para el manejo de datos de NGS están optimizadas para sistemas operativos UNIX. 1.3.1 MobaXterm Descargar e instalar MobaXterm. 52 Chapter 1. Índice biote-2016, Release 1.4 GNU/Linux 1.4.1 Qué es GNU/Linux En términos simples, Linux es un sistema operativo. En la siguiente figura se muestra un diagrama general de cómo está constituido un sistema GNU/Linux. Kernel El kernel es principalmente responsable de cuatro principales funciones: • Manejo del sistema de memoria • Manejo de programas de software • Manejo de hardware • Manejo de sistema de archivos 1.4. GNU/Linux 53 biote-2016, Release Sistema de ficheros El sistema de ficheros está constituido principalmente por los siguientes directorios: Directorio / /bin /boot /dev /etc /home /lib /media /mnt /opt /proc /root /sbin /run /sys /tmp /usr /var Uso raiz del directorio virtual directorio de binarios, donde se almacenan la mayor parte de los programas de GNU/Linux directorio boot, donde están los archivos de arranque directorio de dispositivos, donde Linux crea los nodos de dispositivos configuración del sistema de directorio de archivos directorio home, donde Linux crea los directorios de usuarios directorio de librerías, donde se almacenan librerías del sistema y de aplicaciones directorio de media, un lugar comun para puntos de montaje de dispositivos extraibles directorio de montaje, otro lugar común para puntos de montaj de dispositivos extraibles directorio opcional, frecuentemente utilizado para software de terceros directorio de procesos, donde se almacena información actual de hardware y de procesos directorio home del superusuario root directorio de sistema binario, ahí se almacenan utilidades GNU con nivel de administrador directorio de corrida, ahí se almacenan datos de corrida durante procesos del sistema directorio de sistema, donde se almacena información del sistema de hardware directorio temporal, donde se crean y destruyen archivos temporales de trabajo directorio binario de usuario, dondese guardan los programas ejecutable de usuario directorio variable, para archivos que cambian frecuentemente, como archivos de registro Antes de los sistemas gráficos, la única manera de interactuar con los sistemas Linux era a través de texto en una interfaz de linea de comandos (CLI) provista por el shell. 1.4.2 Distribuciones GNU/Linux Una distribución Linux (coloquialmente llamada distro) es una distribución de software basada en el núcleo Linux que incluye determinados paquetes de software para satisfacer las necesidades de un grupo específico de usuarios, dando así origen a ediciones domésticas, empresariales y para servidores. 54 Chapter 1. Índice biote-2016, Release 1.4.3 Shell El shell es un programa que toma los comandos del teclado y los comunica al sistema operativo para que se lleven a cabo. La mayoría de las distribuciones Linux proporcionan un programa shell del GNU Project llamado bash. A continuación se muestra un directorio parcial con dos usuarios en /home. Por ejemplo, la ruta para el usuario Dan sería /home/dan/ NOTA: es importante distinguir entre /home/dan, /Home/Dan/, /home/Dan/. Linux es sensible a mayúsculas y minúsculas. Los archivos personales de usuario a menudo se encuentran en /home/my-user-name. Existen muchas maneras de 1.4. GNU/Linux 55 biote-2016, Release localizarlos o de referir al directorio de home. cd Sin argumentos, el comando cd nos lleva directamente al directorio home. Variable HOME La variable de entorno HOME contiene el hombre de nuestro directorio home. $ echo $HOME /home/otoniel El comando `echo` imprime el argumento de la variable `$HOME` ~ Cuando se usa en lugar de directorio, la tilde es interpretada por el shell como el nombre del directorio home. $ echo /home/otoniel Otra manera de localizar home es con el comando pwd $ pwd /home/otoniel “print working directory” Emuladores de terminal Cuando se utiliza una interfaz gráfica se necesita un programa llamado emulador de terminal para interactuar con el shell. Los más populares son gnome-terminal, konsole, terminator. 1.5 Terminal Abrimos el emulador de terminal de nuestra preferencia. Deberíamos ver algo como esto: [zorbax@linux ~]$ Esto se llama el prompt del shell y aparece dondequiera que el shell esté listo para aceptar un input. Algunas veces puede variar la apariencia, dependiendo de la distribución, pero usualmente incluirá username@machinename, seguido del directorio actual de trabajo (lo veremos más adelante) y un signo de dolar. Si el útimo caracter del prompt es un hash (#) en lugar de iun signo de dolar, la terminal tiene privilegios de superusuario. Probemos la terminal, introduzcamos algunas letras sin sentido: [zorbax@linux ~]$ gfhbfhbn3tu Como no tienen ningún sentido, el shell nos los hará saber y nos dará otra oportunidad. bash: gfhbfhbn3tu: command not found [zorbax@linux ~]$ 1.5.1 Navegación Ahora, lo primero que necesitamos aprender es cómo navegar en el sistema de archivos Linux: • pwd — Imprime el directorio actual de trabajo. • cd — Cambia de directorio. 56 Chapter 1. Índice biote-2016, Release • ls — Lista los archivos de directorios. Como Windows, un sistema operativo Unix-like, como Ubuntu, orgnaiza sus archivos en lo que se llama estructura jerárquica de directorios. Esto significa que están organizados en un sistema ramificado de directorios ( o folders), los cuales pueden contener archivos u otros directorios.El primer directorio en el sistema de archivos es llamado el directorio raiz (root). pwd Cuando entramos al sistema, o cuando abrimos un emulador de terminal el directorio de trabajo actual será siempre el directorio Home. Para obtener la ruta completa del lugar donde nos encontremos utilizaremos el comando pwd (print working directory): [zorbax@linux ~]$ pwd /home/zorbax Para listar los archivos y directorios en el directorio de trabajo actual usamos el comando ls: [zorbax@linux ~]$ ls bin Desktop Documents Downloads Images Music Videos cd Para cambiar el directorio de trabajo se utiliza el comando cd seguido de la ruta (pathname) de directorio de trabajo deseado. Una ruta es la dirección completa que tomaremos entre las ramas del directorio para llegar al directorio deseado. Las rutas pueden ser absolutas o relativas. Una ruta absoluta comienza con el directorio root y sigue el arbol de directorio hasta la ruta del directorio deseado. Por ejemplo, la ruta /usr/bin, donde la mayoría de los progrmas del sistema son instalados, indica que en el directorio raiz (root, representado por un / ), hay un directorio llamado usr que contiene un directorio llamado bin. [zorbax@linux ~]$ cd /usr/bin [zorbax@linux bin]$ pwd /usr/bin [zorbax@linux bin]$ ls ... ... Hemos cambiado del directorio actual a /usr/bin. Cuando cambiamos de directorio, el prompt cambió automáticamente y muestra el nombre del directorio actual. Una ruta relativa empieza desde el directorio actual hacia el directorio de destino. Para lograrlo utiliza unos símbolos especiales que representan la posición relativa en el árbol del sistema de archivos. Estos símbolos son . (punto) y el .. (punto punto). El símbolo . refiere al directori de trabajo actual y .. refiere al directorio de trabajo parental. Funciona de la siguiente manera, cambiemos nuevamente a /usr/bin: [zorbax@linux ~]$ cd /usr/bin [zorbax@linux bin]$ pwd /usr/bin Si deseamos cambiar al directorio parental de /usr/bin, el cual es /usr, podemos hacerlo de dos maneras: usando una ruta absoluta: [zorbax@linux bin]$ cd /usr [zorbax@linux usr]$ pwd /usr 1.5. Terminal 57 biote-2016, Release o con una ruta relativa: [zorbax@linux bin]$ cd .. [zorbax@linux usr]$ pwd /usr Los dos métodos producen resultados idénticos. ¿Cuál usar? Aquel que requiera teclear menos. De la misma manera podemos cambiar de directorio de trabajo de /usr a /usr/bin de dos maneras diferentes, usando una ruta absoluta: [zorbax@linux usr]$ cd /usr/bin [zorbax@linux bin]$ pwd /usr/bin O una ruta relativa: [zorbax@linux usr]$ cd ./bin [zorbax@linux bin]$ pwd /usr/bin Algo importante que debo aclarar es que en la mayoría de los casos se omite ./ porque está implícito. Escribiendo en la termina: [zorbax@linux usr]$ cd bin se obtiene el mismo resultado. En general, si no se especifica la ruta a algo se asume que se trata del directorio actual. Algunos atajos útiles: • cd Cambia del directorio de trabajo actual al directorio home • cd - Cambia del directorio de trabajo actual al directorio de trabajo anterior. • cd ~ Cambia del directorio de trabajo actual al directorio home del usuario actual, cd ~username cambia al home de cualquier otro usuario. Nix: # Filenames # Hiden filenames # Extensions 1.5.2 Exploración del sistema Ahora que nos sabemos mover en la terminar aprenderemos otros comandos básicos: • ls — Listar el contenido de directorios. • file — Determinar el tipo de archivo. • less — Ver el contenido de un archivo. ls El comando más usado es ls y por buenas razones. Gracias a ls podemos ver el contenido de un directorio y determinar una variedad de atributos importantes de archivos y directorios. [zorbax@linux ~]$ ls bin Desktop Documents Downloads Images Music Videos Además del directorio actual de trabajo, podemos especificar el directorio a listar: 58 Chapter 1. Índice biote-2016, Release [zorbax@linux ~]$ ls /usr bin etc games include lib lib32 local sbin share src O incluso podemos listar varios directorios. En este caso listamos el directoro home de nuestro usuario ( representado por el caracter ~) y el directorio /usr. [zorbax@linux ~]$ ls ~ /usr /home/zorbax: bin Desktop Documents Downloads /usr: bin etc games include lib Images lib32 local Music sbin Videos share src También podemos cambiar el formato de salida que releve un poco más de detalle: [zorbax@linux~]$ ls -l total 84 drwxr-xr-x 57 zorbax 4096 drwxr-xr-x 2 zorbax 16384 drwxr-xr-x 6 zorbax 12288 drwxr-xr-x 6 zorbax 32768 drwxr-xr-x 2 zorbax 4096 drwxr-xr-x 10 zorbax 4096 drwxr-xr-x 2 zorbax 4096 ago ago ago ago ago ago ago 18 20 17 22 18 18 19 17:43 20:57 12:35 09:33 11:17 11:28 23:12 bin Desktop Documents Downloads Images Music Videos Agregando la opción -l al domando cambiamos el formato a large. Opciones y argumentos Algo importante a considerar acerca de cómo funcionan la mayoría de los comandos es que a menudo son seguidos de una o más opciones que modifican su comportamiento, y además, uno o más argumentos, los ítems sobre los cuales los comandos actuan. Así, la mayoría de los comandos lucen de la siguiente manera: command -options arguments La mayoría de los comandos usan opciones que corresponden a un solo caracter precedido por un guión, por ejemplo -l. Aunque los comandos del GNU Project también aceptan opciones en versión larga, que consiste en una palabra precedidad por dos guiones. Por ejemplo, en el comando ls -lt, -l produce una salida en formato detallado y -t ordena los resultados por fecha de la última modificación. [zorbax@linux~]$ ls -lt total 84 drwxr-xr-x 6 zorbax 32768 drwxr-xr-x 2 zorbax 16384 drwxr-xr-x 2 zorbax 4096 drwxr-xr-x 57 zorbax 4096 drwxr-xr-x 10 zorbax 4096 drwxr-xr-x 2 zorbax 4096 drwxr-xr-x 6 zorbax 12288 ago ago ago ago ago ago ago 22 20 19 18 18 18 17 09:33 20:57 23:12 17:43 11:28 11:17 12:35 Downloads Desktop Videos bin Music Images Documents Agregamos la opción --reverse para ordenar de forma inversa el orden listado a detalle (–reverse es equivalente a -r en la versión corta). [zorbax@linux~]$ ls -lt --reverse total 84 drwxr-xr-x 6 zorbax 12288 ago 17 drwxr-xr-x 2 zorbax 4096 ago 18 drwxr-xr-x 10 zorbax 4096 ago 18 drwxr-xr-x 57 zorbax 4096 ago 18 drwxr-xr-x 2 zorbax 4096 ago 19 1.5. Terminal 12:35 11:17 11:28 17:43 23:12 Documents Images Music bin Videos 59 biote-2016, Release drwxr-xr-x drwxr-xr-x 2 zorbax 16384 ago 20 20:57 Desktop 6 zorbax 32768 ago 22 09:33 Downloads Personalmente las opciones que más utilizo son: ls -ltrh y ls -ltrhR. file Mientras exploramos el sistema, es útil saber qué tipo de archivo contiene. Para realizarlo utilizaremos el comando file. El nombre del archivo no requiere reflejar su contenido, así puede haber un archivo txt y lo puedo nombrar como mp3. [zorbax@linux~]$ echo "Esto es un simulacro" > the_next_friday.mp3 [zorbax@linux~]$ file the_next_friday.mp3 the_next_friday.mp3: ASCII text [zorbax@linux~]$ file song.mp3 song.mp3: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 64 kbps, 48 kHz, St [zorbax@linux~]$ file bin/fastqc bin/fastqc: symbolic link to /home/zorbax/bin/FastQC/fastqc [zorbax@linux~]$ file seqtk seqtk: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld Hay muchos tipos de archivos. De hecho, una de las ideas de los sistemas operativos tipo Unix es que “todo es un archivo”. less El comando less es un programa para visualizar texto. En el sistema Linux hay muchos archivos que contienen texto legible. El uso del comando es: less filename Una vez iniciado, el programa permitirá ver todo el texto de principio a fin desplazándonos con up-down. Para salir hay que presionar la tecla Q. less /etc/passwd 1.5.3 Manipulación de archivos Hasta este punto estamos listos para algo de trabajo en el MundoReal™. A continuación veremos los siguientes comandos: • mkdir — Crear directorios. • cp — Copiar archibos y directorios. • mv — Mover/renombrar archivos y directorios. • rm — Eliminar archivos y directorios. • ln — Crear vínculos simbólicos. Estos cinco comandos son los comandos más frecuentes. Se utilizan para manejar archivos y directorios. Para ser honesto, algunas tareas realizadas por estos comandos son más fáciles de realizar con un gestor gráfico de archivos. Con el gestor de archivos sólo arrastramos y soltamos en un directorio, copiamos, pegamos, borramos archivos y así. 60 Chapter 1. Índice biote-2016, Release Sin embargo, el poder y flexibilidad que dan estos comandos es la razón principal por la que se siguen usando. Es fácil realizar acciones sencillas en el gestor de archivos, pero tareas más complicadas pueden realizarse de manera más fácil con programas de la linea de comandos. Comodines Antes de empezar a usar los comandos es necesario hablar de aquellas características que hacen que los comandos sean poderosos. La shell usa nombres de archivos para actuar, y provee además caracteres especiales para ayudar a especificar rápidamente grupos específicos de Estos caracteres especiales son llamados comodines. Usando dichos comodines (también llamados globbing) permite seleccionar nombres de archivo basadas en patrones de caracteres. Los dos comodines más comunes son: *, cualquier caracter y ?, cualquier caracter único. Por ejempo: • * -> Todos los archivos • g* -> Todos los archivos que comiencen con g • *fa -> Todos los archivos que terminen con fa • b*.txt -> Cualquier archivo que comience con b seguido de cuakquier caracter y termina con .txt mkdir El comando mkdir sirve para crear directorios. Funciona de la siguiente manera: mkdir directory... Cuando escribo puntos suspensivos después de un argumentos en la descripción del comando, como arriba, quiere decir que el argumento puede ser repetido, en este caso: mkdir dir1 creará un directorio llamado dir1, mientras que: mkdir dir1 dir2 dir3 creará tres directorios llamados, dir1, dir2, dir3, respectivamente. Además se puede crear directorios anidados con la opción -p: mkdir -p this/is/a/nested/folder mkdir -p /this/is/a/nested/folder #Este comando dará error ¿por qué? También se pueden crear directorios con base en un número consecutivo: mkdir sample{01..10} Creará diez folders, desde el folder sample01 hasta sample10. cp El comando cp copia archivos y directorios. Se puede utilizar de dos maneras diferentes. Para copiar un solo archivo o directorio item1 al archivo o directorio item2 y: cp item1 item2 para copiar multiples ítems (archivos o directorios) a un directorio. cp item... directory Las opciones más comunes son: 1.5. Terminal 61 biote-2016, Release • -i, Antes de sobreescribir un archivo existente, pregunta al usuario por confirmación. Si no se especifica esta opción cp sobreescribirá silenciosamente los archivos. • -r, copia recursiva de directorios y su contenido. Opción requerida para copiar directorios. • -u, cuando se copian archivos de un directorio a otro, copia sólo los archivos que, o no existan o sean más nuevos que los archivos existentes correspondientes en el directorio de destino. • -v, Despliega información de proceso de copiado. Ejemplos: Copiar el archivo file1 al archivo file2. Si el archivo file2 extiste, sobreescribirá su contenido con el contenido del archivo file1. Si el archivo file2 no existe, se creará: cp file1 file2 Lo mismo de arriba, excepto que si el archivo file2 existe, el usuario es notificado antes de sobreescribir el archivo: cp -i file1 file2 Copiar archivo file1 y el archivo file2 en el directorio dir1. Es necesario que el directorio dir1 exista: cp file1 file2 dir1 Usando un comodín, todos los archivos del directorio dir1 son copiados en dir2. El directorio dir2 debe de existir: cp dir1/* dir2 Copia el directorio dir1 (y su contenido) al directorio dir2. Si el directorio dir2 no existe, se creará y tendrá el mismo contenido que el directorio dir1: cp -r dir1 dir2 mv El comando mv renombra y mueve archivos, dependiendo de cómo es utilizado. Em ambos casos el archivo original dejará de existir después de ejecutarlo. Se puede utilizar en la misma manera que cp, para mover o renombrar archivos o directorio item1 a item2: mv item1 item2 o mover uno o más ítems de un directorio a otro. mv item... directory Algunas opciones de mv las comparte con cp: • -i, Antes de mover un archivo existente, pregunta al usuario por confirmación. Si no se especifica esta opción mv sobreescribirá silenciosamente los archivos. • -u, cuando se mueven archivos de un directorio a otro, mueve sólo los archivos que, o no existan o sean más nuevos que los archivos existentes correspondientes en el directorio de destino. • -v, Despliega información de proceso de mv. Ejemplos: Mover archivo file1 al archivo file2. Si el archivo file2 existe, se sobreescribirá con el contenido del archivo file1. Si el archivo file2 no existe se creará. En ambos casos el archivo file1 deja de existir. 62 Chapter 1. Índice biote-2016, Release mv file1 file2 Al igual que el ejemplo anterior, excepto que si el archivo file2 existe, el usuario es notificado antes de sobreescribir el archivo: mv -i file1 file2 Mover los archivos file1 y file2 al directorio dir1. El directorio dir1 debe de existir. mv file1 file2 dir1 Mueve el directorio dir1 ( y su contenido) al directorio dir2. Si el directorio dir2 no existe, crea el directorio dir2, mueve el contenido del directorio dir1 al directorio dir2, y borra el directorio dir2. mv dir1 dir2 rm El comando rm se utiliza para borrar archivos y directorios. Como esta linea, donde item es el nombre de uno o más archivos o directorios: rm item... ¡¡¡PRECAUCIÓN CON rm!!! En los sistemas operativos tipo Unix, como el GNU/Linux, no existe el comando undo, o ctrl + Z, por lo menos en la terminal. Una vez que se borra algo con rm es irrecuperable. Linux asume que eres inteligente y sabes lo que estás haciendo (sic). Tengan cuidado con los comodines. Esto le sucedió al primo de un amigo: digamos que se requiere borrar los archivos FASTA de nuestro directorio, basta con: rm *.fasta lo cual es correcto, pero si accidentalmente se coloca un espacio entre * y .fasta rm * .fasta el comando rm borraré todos los archivos del directorio y dara error debido a que no encuentra archivos con la extensión FASTA. TIP: siempre que utilicen comodines con rm (además de revisar cuidadosamente mientras se escribe), prueben el comodín con ls. Esto les mostrará los archivos a borrar. Luego presionar la flecha up para llamar nuevamente el comando y reemplazar ls con rm. Las opciones más comunes son: • -i, antes de borrar un archivo pregunta al usuario por confirmación. Si no se especifica se borrarán los archivos de manera silenciosa. • -r, borra recursivamente los directorios. Esto significa que si el directorio tiene subdirectorios, éstos serán borrados también. Para borrar un directorio esta opción debe de especificarse. • -f, Ignora los archivos no existentes y no pregunta nada. • -v, Despliega mensajes informativos conforme se lleva acabo el proceso de borrado. Manipulating Files and Directories Ejemplos: Borrar el archivo file1 silenciosamente. 1.5. Terminal 63 biote-2016, Release rm file1 Antes de borrar el archivo file1 notifica al usuario por confirmación. rm -i file1 Borra el archivo file1 y el directorio dir1 y su contenido. rm -r file1 dir1 Lo mismo que el anterior, excepto que si tanto el archivo file1 o el directorio dir1 no existe, rm continuará silenciosamente. rm -rf file1 dir1 ¿Cuál sería el inconveniente de ejecutar rm -rf /*? ¿Por qué? ln Quizá cuando estemos navegando en los directorios encontraremos una entrada como esta, por ejemplo en $HOME/bin: lrwxrwxrwx 1 zorbax 30 oct 28 2014 fastqc -> /home/zorbax/bin/FastQC/fastqc La primera letra de los atributos es l, y pareciera ser que el archivo tiene dos nombres, uno en $HOME/bin y otro en $HOME/bin/FastQC/fastqc. Este tipo de archivos es llamdo enlaces simbólicos ( soft link o también symlink). En la mayoría de los sistemas Unix es posible tener un archivo referenciado con múltiples nombres. Ésta es una característica muy útil ya que permite tener el archivo disponible sin necesidad de copiar nuevamente el archivo. Suponiendo que tenemos archivos fastq provenientes de secuenciación masiva. Los enlaces simbólicos nos permitirá ir renombrando los archivos sin necesidad de modificar los datos crudos. Además, nos permite ‘copiar’, como enlaces simbólicos, en diferentes carpetas sin necesidad de duplicar archivos y sobre todo sin necesidad de generar más espacio en el disco duro. [zorbax@linux raw_data]$ pwd /home/zorbax/Documents/raw_data [zorbax@linux data]$ ls ... ... *fastq files ... ... Supongamos que quiero trabajar en el directorio analysis y necesito que los archivos fastq estén en /home/zorbax/Documents/Dropbox/analysis/qiime/input: cd /home/zorbax/Documents/Dropbox/analysis/qiime/input ln -s /home/zorbax/Documents/raw_data/*fastq . La estructura del comando es: ln -s /path/to/file /path/to/symlink Los enlaces simbólicos se borrar con rm y al hacerlo unicamente de borra el enlace, no el archivo. 1.5.4 Redireccionamiento I/O Una de las mejores características de la linea de comandos es la redirección I/O (input-output). Esta características implica que se puede redireccionar el input y el output de comandos hacia y desde harchivos, así como conectar multiples comandos para generar útiles lineas de procesos - *pipelines - de comandos. Para descubrir dicha característica debemos de conocer los siguientes comandos: 64 Chapter 1. Índice biote-2016, Release • cat — Concatena archivos. • sort — Ordena lineas de texto. • uniq — Reporta u omite lineas repetidas. • wc — Imprime la cuenta de salto de linea, palabra y byte de cada linea. • grep — Imprime linead que coninciden con un patrón. • head — Imprime en pantalla la salida de la primera parte de un archivo. • tail — Imprime la última parte de un archivo. • tee — Lee de un input estándar y escribe a un output estándar y a archivos. Entrada, salida y error estándar Muchos de los programas que utilizamos producen una salida-output de alguna clase. Esta salida-output frecuentemente consiste en dos tipos. Primero, tenemos el resultado del programa, el cual es, los datos que el programa está diseñado a producir. Segundo, tenemos mensajes de estatus y de error que nos dice cómo está llendo el programa. Si observamos el comando ls, vemos que muestra su resultado y su mensaje de error en la pantalla. Manteniendo en mente lo que escribí hace un momento de que “todo es un archivo”, el programa ls envía su resultado hacia un archivo especial llamado salida estándar (standar output, frecuentemente stdout) y su mensaje de estatus a otro archivo especial llamado standar error (sterr) Por default, tanto el error y la salida estándar están vinculados a la pantalla y no se guardan en un archivo en el disco. Además, muchos programas toman la entrada de algo llamado entrada standar (stdin), el cual está por default, anexo al teclado. La redirección I/O nos permite cambiar a dónde va la salida y de dónde viene la entrada. Normalmente, la salida va a la pantalla y la entrada viene del teclado, pero con la redirección I/O podemos cambier ese orden. Redirección a salida estándar Para redireccionar la salida estándar a otro archivo en lugar de la pantalla, utilizamos el operador de redirección > seguido del nombre del archivo. ¿Por qué habríamos de hacer eso? A menudo es útil almacenar en un archivo la salida de un comando. Por ejemplo, podríamos mandar la salida del comando ls a un al archivo ls_output.txt en lugar de la pantalla. ls -l /usr/bin > ls_output.txt La finalidad del comando ls es obtener una lista de /usr/bin y enviar el resultado al archivo ls_output.txt. Si examinamos un poco más el archivo de salida, notaremos que es un archivo de texto algo extenso. ls -l ls_output.txt > -rw-r--r-- 1 zorbax 198059 ago 20 05:26 ls_output.txt Si vemos el contenido del archivo con less observaremos que de hecho contiene la salida del comando ls. less ls_output.txt Repitamos la redirección pero ahora démosle un pequeño giro. Cambiaremos el nombre del directorio a uno que no existe. ls -l /bin/usr > ls_output.txt > ls: cannot access /bin/usr: No such file or directory Obtuvimos un mensaje de error. Esto tiene sentido pues especificamos un directorio que no existe /bin/usr, pero ¿por qué el mensaje de error de desplegó en la pantalla en lugar de redireccionarse al archivo ls_output.txt. La respuesta es que el programa ls no envió el mensaje de error a la salida estándar, lo envió al error estándar por lo 1.5. Terminal 65 biote-2016, Release que el mensaje fue enviado a la pantalla. Si revisamos nuevamente nuestro archivo nos daremos cuenta de que está vacío. ls -l ls_output.txt > -rw-r--r-- 1 zorbax 0 ago 20 05:28 ls_output.txt Podemos redireccionar la salida al archivo pero en lugar de sustituirlo podemos reescribir el contenido con el operador >> : ls -l /usr/bin >> ls-output.txt Usando este operador el resultado se agregará al archivo de salida, en lugar de sobreescribirlo. Si el archivo ni existe lo creará, al igual que >. /usr/bin >> ls_output.txt /usr/bin >> ls_output.txt /usr/bin >> ls_output.txt ls -l ls_output.txt > -rw-r--r-- 1 zorbax 594177 ago 20 05:38 ls_output.txt Repetimos el comando tres veces, así que obtendremos un archivo de salida tres veces más grande que el original, ya que la salida del comando se va añadiendo al archivo ls_output.txt. Redireccionamiento a error estándar Para redireccionar el error estándar no existe un operador asignado, sim embargo, podemos referirlo a su descriptor de archivo. Un programa puede generar muchos tipos de archivo, pero siempre referirá los primeros tres a la entrada, salida y error estándar. El shell los refiere con los descriptores de archivos 0, 1 , y 2 , respectivamente. Ya que el error estándar es igual al descriptor de archivo 2 podemos redireccionar el error estándar con esta notación: ls -l /bin/usr 2> ls_error.txt EL descriptor 2 está colocado antes del operador de redirección para realizar la redirección del error estándar al archivo ls_error.txt Redireccionamiento de salida y error estándar a un archivo Hay casos en los que se desea capturar todo la salida de un comando a un archivo. Para hacerlo, redireccionaremos tanto la salida estándar y el error estándar al mismo tiempo. Hay dos formas de hacerlo, la forma tradicional, que funciona con versiones antiguas de shell. 66 Chapter 1. Índice biote-2016, Release ls -l /bin/usr > ls_output.txt 2>&1 Usando este método, se realizan dos redirecciones. Primero redirigimos la salida estándar al archivo ls_output.txt, y luego redireccionamos el descriptor de archivo 2 (error estándar) al descriptor de archivo 1 (salida estándar) usando la notación 2>&1 El orden de la redirección es importante. La redirección del error estándar siempre debe de ocurrir después de la redirección a la salida estándar o no funcionará. En el ejemplo anterior, > ls_output.txt 2>&1 redirecciona el error estándar al archivo ls_output.txt , pero si se cambia el orden a 2>&1 > ls-output.txt el error estándar es redireccionado a la pantalla. Otra manera de combinar la redirección: ls -l /bin/usr &> ls_output.txt En este ejemplo, se utiliza la notación &> para redireccionar tanto la salida estándar y el error estándar al archivo ls_output.txt. Silenciando salida no deseada En otras ocasiones no deseamos guardar la salida de un comando, principalmente para los mensajes de error y de estado. El sistea provee una manera de redireccionar la salida a un archivo especial llamado /dev/null, el cual es en pocas palabras una papelera de bits. que acepta entrada datos pero no hace nada con ellos. Para suprimir mensajes de error de un comando: ls -l /bin/usr 2> /dev/null Redireccionamiento de entrada estándar cat El comando cat lee uno mas archivos y los copia a la salida estándar: cat file... También se usa para mostrar el contenido de archivos de texto sin paginar el contenido. cat ls_output.txt Linea de procesos Hemos visto que es importante tener control acerca de la salida de un comando, de dónde viene y hacia dónde va (vía redirección), pero también es posible que la salida de un comando pase a través de un comando a la entrada de otro comando (vía pipe). Este proceso es conocido como pipeline o linea de procesos. Cada proceso se separa con un pipe ( | ). command1 | command2 Para demostrar una linea de procesos necesitamos aprender algunos comandos. Hemos visto un comando que acepta la entrada estándar, less. Podemos utilizar dicho comando para imprimir en pantalla, página por página, la salida de cualquier comanto que envíe su resultado a la salida estándar: ls -l /usr/bin | less Podemos examinar la salida de cualquier comando que produzca salida estándar. 1.5. Terminal 67 biote-2016, Release Filtros Las lineas de procesos son útiles para realizar operaciones complejas con datos. Frecuentemente se usa de una manera en que se refiere a ellos como filtros. Los filtros pueden tomar la entrada, cambiar algo y enviarlo a la salida estándar. sort Si deseamos combinar una lista de todos los programas ejecutable en /bin y /usr/bin, ordenarlos y visualizar la lista. Las opcines más comunes son -n para ordenar los valores numéricos y -r, para obtener la lista en orden inverso. ls /bin /usr/bin | sort | less uniq Este comando nos permite omitir lineas repetidas. Se usa a menudo junto con sort. Utiliza como entrada estándar una lista de datos ordenados y por defecto elimina las lineas repetidas. Con la opción -c podemos obtener 68 Chapter 1. Índice biote-2016, Release cuántas veces está repetida la linea: ls /bin /usr/bin | sort | uniq | less Si queremos ver las lineas duplicadas, utilizamos la versión -d ls /bin /usr/bin | sort | uniq -d | less wc El comando wc (word count) es utilizado para mostrar el número de lineas, palabras y bytes que contiene un archivo. wc ls_output.txt 3303 28338 198698 ls_output.txt Los tres números corresponden a lineas, palabras y bytes, respectivamente, contenidas en el archivo ls_output.txt. Al agregarlo al pipeline es una manera fácil de contar elementos, en este caso, nos interesa el número de lineas. ls /bin /usr/bin | sort | uniq | wc -l 3452 grep El comando grep imprime lineas que coinciden con un patrón de texto. grep pattern [file...] El ‘patrón’ que grep reconozca puede ser muy complejos ( grep -v "^#\|^’\|^\/\/" file.txt ), pero para fines prácticos del curso nos enfocaremos en coindicencias con texto. Digamos que queremos encontrar aquellos archivos de nuestra lista de programas que tengan la palabra zip en el nombre: ls /bin /usr/bin | sort | uniq | grep zip bbunzip2 bzip2 bzip2recover funzip gpg-zip gunzip gzip lzip lzip.lzip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit 1.5. Terminal 69 biote-2016, Release Algunas de las opciones más útiles de grep: -i - Hace que el comando ignore mayúsculas y minúsculas. Las búsquedas en Unix son sensible a dichas diferencias. -v - Le dice al programa que imprima aquellas que no coincidan con el patrón. -c - Le dice al program que cuente cuántas veces se encuentra el patrón en la lista. head/tail A menudo no queremos todo la salida de un comando. Estos comandos nos ayudan a obtener la primera parte y la última parte de un archivo, las primeras y las últimas 10 lineas, respectivamente. El número de lineas puede ser modificado con la opción -n. head -n 5 ls_output.txt total 547960 -rwxr-xr-x 1 root 39464 lrwxrwxrwx 1 root 8 -rwxr-xr-x 1 root 106 -rwxr-xr-x 1 root 96 mar 14 mar 16 ene 26 mar 1 2015 2015 2013 2015 [ 2to3 -> 2to3-2.7 2to3-2.6 2to3-2.7 Estos comandos también funcionan con la salida de otros comandos: ls /usr/bin | tail -n 5 zipinfo zipnote zipsplit zjsdecode zlib-flate El comando tail tiene una opción que nos permite monitorear archivos en tiempo real. En el siguiente ejemplo veremos mensajes del archivo /var/log/messages. Para ello se requiere permisos de superusuario, más adelante explicaremos en qué consiste dichos privilegios. tail -f /var/log/messages Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: Aug 24 22:21:38 amidala kernel: 70 [2371005.944927] [2371005.944927] [2371005.944943] [2371005.944944] [2371005.944944] [2371005.944946] [2371005.944947] [2371005.944948] CPU3: CPU7: CPU4: CPU0: CPU1: CPU2: CPU5: CPU6: Package Package Package Package Package Package Package Package temperature/speed temperature/speed temperature/speed temperature/speed temperature/speed temperature/speed temperature/speed temperature/speed normal normal normal normal normal normal normal normal Chapter 1. Índice biote-2016, Release tee Tomando una analogía de la plomería, Unix provve un comanto llamado tee el cual crea una “T” en nuestra linea de procesos. Este comando lee la entrada estándar y lo copia a la salida estándar (permitiendo que los datos sigan en la linea de procesos) y a uno o más archivos. Este comando es útil para capturar el contenido de una linea de procesos en una etapa intermediaria o final de procesamiento. ls /usr/bin | tee ls.txt | grep zip funzip gpg-zip lzip lzip.lzip mzip p7zip preunzip prezip prezip-bin unzip unzipsfx zip zipcloak zipdetails zipgrep zipinfo zipnote zipsplit Ejemplo A continuación les dejo un ejemplo muy rebuscado para terminar un proceso. En el apartado *Tareas veremos una manera más sencilla hacerlo. El comando ps aux obtendrá una lista de los procesos que están corriendo además de alguna información adicional. La segunda columna es el número identificador de cada proceso (PID). ps aux USER root root zorbax zorbax zorbax zorbax zorbax zorbax zorbax zorbax zorbax zorbax zorbax PID %CPU %MEM VSZ RSS TTY 715 0.0 0.2 431276 14280 ? 853 0.0 0.1 278484 6088 ? 1942 0.0 0.2 366064 13884 ? 1985 0.1 0.6 359468 39172 ? 1990 0.0 0.6 584088 36148 ? 2008 0.1 1.0 1238336 62616 ? 2026 0.0 0.9 511608 54480 ? 2028 0.1 3.3 2686964 198416 ? 2418 17.6 30.6 3080640 1811536 ? 2562 0.0 0.9 502464 57128 ? 2571 0.0 0.1 29496 11464 pts/0 2598 0.0 0.1 29500 11436 pts/1 2605 0.0 0.1 29496 11420 pts/2 1.5. Terminal STAT Ssl SLsl Ssl Sl Sl Sl Sl Sl Sl Sl Ss Ss Ss+ START TIME COMMAND ago23 0:09 /usr/sbin/NetworkManager --no-daemon ago23 0:00 /usr/sbin/lightdm ago23 0:00 mate-session ago23 1:41 marco ago23 0:05 mate-panel ago23 1:31 caja ago23 0:07 /home/zorbax/bin/cloud ago23 1:31 /usr/bin/python /usr/local/bin/turpi ago23 201:07 firefox-esr ago23 0:07 /usr/bin/python /usr/bin/terminator ago23 0:00 /bin/bash ago23 0:00 /bin/bash ago23 0:00 /bin/bash 71 biote-2016, Release zorbax zorbax zorbax zorbax 2908 5646 11221 11260 0.0 0.0 0.0 0.0 0.0 13260 1648 ? 0.2 47704 12756 pts/0 0.5 438880 32236 ? 0.0 19104 2552 pts/1 S S+ Sl R+ ago23 13:07 18:21 18:24 0:00 0:02 0:00 0:00 /bin/bash /usr/bin/atom python -m SimpleHTTPServer pluma ps aux Sólo estoy intersado en un proceso pluma, así que utilizo grep para obtener la lines que me interesa. ps aux | grep pluma zorbax zorbax 11221 11400 0.0 0.0 0.5 438880 32236 ? 0.0 12752 2232 pts/1 Sl S+ 18:21 18:31 0:00 pluma 0:00 grep --color=auto pluma Obtengo una lista breve de los procesos que estoy corriendo, ps aux para obtener la lista completa y grep para filtrar con base en el patrón que deseo. Ahora, utilizo la opción -v en grep para que excluya las lineas que contengan cierto patrón, en este caso grep ps aux | grep pluma | grep -v grep zorbax 11221 0.0 0.5 438880 32236 ? Sl 18:21 0:00 pluma Ahora que tengo aislada la linea de mi proceso deseo obtener su PID para poder terminarlo. Para ello deseo imprimir sólo la segunda palabra de la linea obetenida. Afortunadamente la mayoría de versiones Unix tienen awk, un lenguaje de programación que se especializa en datos tabulares. Una característica muy útil de este lenguaje es que se puede usar en una linea de procesos. ps aux | grep pluma | grep -v grep | awk ‘{print $2}’ 11221 Una vez obtenido el PID es necesario ‘pasar’ el número al comando kill, el cual finalizará el proceso. Para ello necesitaremos xargs. ps aux | grep pluma | grep -v grep | awk '{print $2}' | xargs kill Misión cumplida :D 1.5.5 Permisos Los sistemas Unix son multitarea y multiusuarios. Esto significa que más de una persona puede usar la computadora al mismo tiempo. Aunque sólo tenga un teclado y un monitor, aún puede ser utilizada por más de un usuario. Si la computadora está conectada a una red o a internet, los usuarios se pueden conectar de manera remota vía ssh (Tareas) En esta parte veremos algunos comandos encargados de proteger los archivos de acciones de otro usuario: • chmod — Cambia el modo de un archivo. • su — Ejecuta la shell como otro usuario. • sudo — Ejecuta comandos como otro usuario. • chown — Cambia el propietario de un archivo. • passwd — Cambia la contraseña de un usuario. Propietario, miembros de grupo y otros En algún momento de los ejercicios anteriores, cuando estabamos viendo lo de error y la salida estándar nos encontramos con el siguiente problema. Intentaremos con otro archivo: file /etc/shadow /etc/shadow: regular file, no read permission 72 Chapter 1. Índice biote-2016, Release less /etc/shadow /etc/shadow: Permission denied La razón del ‘error’ es que los usuarios regulares no tienen permiso de leer ese archivo. En Unix todos los usuarios tienen sus propios archivos y directorios. Cuando un usuario es propietario de un archivo o directorio, el usuario tiene control sobre su acceso, así que sólo él decide qué grupo puede acceder o si bien lo decide que sea accesible a todo el mundo. El usuario puede cambiar la propiedad, el modo y el acceso a los archivos y directorios. Lectura, escritura y ejecución Los derechos de acceso a los archivos y directorios son definidos en términos de acceso de lectura, acceso de escritura y acceso de ejecución. Con el comando ls -l nos podemos dar cuenta de cómo son implementados: ls -l drwx-----6 4.0K drwxr-xr-x 9 16K -rwxr-xr-x 1 194K lrwxrwxrwx 1 28 -rwxr-xr-x 1 3.0K -rwxr-xr-x 1 1.3M drwxr-xr-x 13 4.0K drwxr-xr-x 5 4.0K drwxr-xr-x 313 12K drwxr-xr-x 3 4.0K may jul jul jul jul jul ago ago ago ago 13 14 16 25 25 28 3 4 10 17 11:55 17:34 21:25 00:07 10:34 00:06 19:53 16:40 07:15 12:22 BRIG-0.95-dist/ pandaseq/ seqtk* thunderbird -> /opt/thunderbird/thunderbird* monitor* usearch61* Phinch/ lefse/ R/ python/ Ejemplos 1.5. Terminal 73 biote-2016, Release • -rwx------ — Un archivo regular es legible, grabable y executable por el propietario del archivo. Nadie más tiene acceso. • -rw------- — Un archivo regular que es legible y grabable por el propietario del archivo. Nadie más tiene acceso. • -rw-r--r-- — Un archivo regular que es legible y grabable por el propietario del archivo. Los mientros del grupo del propietario pueden leer el archivo. Todos los demás también pueden leer el archivo. • --rwxr-xr-x — Un archivo regular que es legible, grabable y ejecutable por el propietario del archivo. El archivo también puede ser leído y ejecutado por todos los demás. • -rw-rw---- — Un archivo regular que sólo es legible y grabable por el propietario del archivo y por miembros del grupo del usuario. • lrwxrwxrwx — Un link simboplico. Todos los links simbólicos tienen permisos ‘postizos’. Los permisos reales se mantiene en el archivo vinculado al que apunda el enlace simbólico. • drwxrwx--- — Un directorio. El propietario y los miembros del grupo del usuario pueden accesar al directorio y crear, renombrar y eliminar archivos. Los miembros del grupo del usuario puede acceder al directorio pero no puede crear, borrar o renombrar archivos. chmod Para cambiar el modo (permisos) de un archivo o directorio, se utiliza el comando chmod. Hay que tener en consideración de que sólo el propietario del archivo o el superusuario puede cambiar el modo de un archivo o directorio. Con chmod se puede utilizar números octales y una representación simbólica. Octal 0 1 2 3 4 5 6 7 Binario 000 001 010 011 100 101 110 111 Modo — –x -w-wx r– r-x rwrwx chmod Anotación simbólica: • u — Abreviación para usuario, representa al porpietario del archivo o directorio. • g — Propitario de grupo. • o — Abreviación para otros, pero implica a ‘todo el mundo’. • a — Abreviación para todos, la combinación de u, g y o 74 Chapter 1. Índice biote-2016, Release Exemplos de notación simbólica de chmod: • u+x — Agrega permisos de ejecución para el usuario. • u-x — Elimina permisos de ejecución del usuario. • +x — Agrega permisos para el propietario, grupo y todos el mundo. Equivale a a+x. • o-rw — Elimina permisos de lectura y escritura para cualquier persona, además del propietario y grupo del propietario. • go=rw — Asigna al propietario del grupo y a todos además del propietario a que tenga permiso de lectura y escritura. Si el propietario del grupo o todos los demás tenían premisos de ejecución, es removido el permiso. • u+x,go=rx — Agrega permisos de ejecución para el propietario y configura los permisos para el grupo y todos los demás para que puedan leer y ejecutar. su El comando su se usa para iniciar una shell como otro usuario. La sintaxis es de la siguiente manera: su [-[l]] [user] Si se uncluye la opción -l (también se puede abreviar -), la shell que se obtenga será la especificada para dicho usuario. Eso significa que el entorno del usuario se cargará y se cambiará al directorio home del usuario. Si no se especifica usuario, se asume que se requiere usar el superusuario. zorbax@beatrix~:$ su Password: root@beatrix~:# 1.5. Terminal 75 biote-2016, Release sudo El comando sudo es como su, de hecho Ubuntu configura a sudo para que le permita ejecutar comandos como otro usuario (generalmente superuser), pero en un ámbito más controlado que su. El acceso con sudo no requiere la contraseña del superusuario, sólo basta la contraseña de usuario. sudo file /etc/shadow /etc/shadow: ASCII text sudo less /etc/shadow # :O chown El comando chown se utiliza para cambiar el propietario y el propietario de grupo de un archivo o directorio. Para este comando se requieren privilegios de superusuario. La sintaxis de este comando es: chown [owner][:[group]] file... El comando chown puede cambiar el propietario de un archivo y/o el grupo propietario dependiendo del primer argumento del comando. Este comando es de mucha utilidad cuando se accede a servidores remotos donde uno no tiene acceso a todos los archivos y se tiene que interactuar con diferentes propietarios. Ejemplos • bob — Cambia el propietario actual del archivo a bob. • bob:users — Cambia el propietario de un archivo de su propietario actual al usuario bob y cambia el propietario del grupo al grupo users. • :admins — Cambia el propietario de grupo al grupo admins. El propietario del archivo sigue sin modificaciones. • bob: — Cambia el propietario de archivos del propietario actual al usuario bob y cambia el propietario de grupo al login de grupo del usuario bob. 1.6 Entorno El shell mantiene información durante la sesión de shell, el entorno. Los datos almacenados en el entorno es usado por los programas para determinar ciertos datos acerca de nuestra configuración. La mayoría de los programas utiliza archivos de configruación para almacenar las configuraciones del programa, algunos otros buscan los valores almacenados en el entorno para ajustar su comportamiento. 1.6.1 Variables de entorno El shell almacena dos tipos de datos en el entorno. Hay variables de entorno y variable de shell. Las variables de shell son datos colocados por bash y las variables de entorno son todas las demás. El shell también puede almacenar algunos otros datos, como alias y funciones. Para visualizar las variables del entorno: printenv | less Para visualizar una variable en particular del entorno: echo $PATH echo $HOME 76 Chapter 1. Índice biote-2016, Release 1.6.2 Variables shell Es una manera simple de referir datos en la memoria, los cuales pueden ser usados y modificados con base en la estructura del script. Por ejemplo, puedo definir una variable con un valor: name="Otoniel" echo "Hello $name" name="world!" echo "Hello $name" name=`whoami` figlet "Hello $name" 1.6.3 Funciones de shell, alias ¿Cómo se determina los parámetros del entorno? Cuando iniciamos sesión en el sistema, el bash inicia y lee una serie de scripts de configuración llamados archivos de inicio, los cuales definen el comportamiento del entorno compartido por todos los usuarios. Esto es seguido por archivos de inicio en nuestro directorio de home que define nuestro entorno personal. Shell que requiere y no requiere inicio de sesión Una shell de inicio de sesión es aquella en la cual se solicita nuestro nombre de usuario y la contraseña, por ejemplo cuando iniciamos una sesión en una consola virtual. Una shell que no requiere inicio de sesión ocurre cuando lanzamos una sesión en terminal en interfaz gráfica. Archivos de inicio para shell que requiere inicio de sesión: • /etc/profile — El archivo de configuración global que aplica para todos los usuarios. • ~/.bash_profile — El archivo de inicio personal de cada usuario. • ~/.bash_login — Si no encuentra el archivo ~/.bash_profile, bash intentará leer este otro archivo. • ~/.profile — Si no encuentra ~/.bash_profile y tampoco a ~/.bash_login, bash intentará de leeer este archivo. Este es el default para distribuciones basadas en Debian, como Ubuntu. Archivos de inicio para shell que no requiere inicio de sesión: • /etc/bash.bashrc — Archivo global de configuración que aplica para todos los usuarios. • ~/.bashrc — Archivo de inicio personal de cada usuario. Puede ser usado para extender o anular configuraciones globales. Funciones Una función del shell es una subrutina, un bloque de código que implemente un grupo de operaciones, incorporada en el entorno. Son de mucha utilidad cuando se definen en los archivos de inicio del shell y permite realizar algunas operaciones de manera mucho más sencilla. Ejemplos 1.6. Entorno 77 biote-2016, Release extract () { if [ -f $1 ] ; then case $1 in ;; *.tar.bz2) tar xjf $1 tar xzf $1 ;; *.tar.gz) bunzip2 $1 ;; *.bz2) .rar) rar x $1 ;; * gunzip $1 ;; *.gz) tar xf $1 ;; *.tar) tar xjf $1 ;; *.tbz2) .tgz) tar xzf $1 ;; * unzip $1 ;; *.zip) uncompress $1 ;; *.Z) echo "'$1' cannot be extracted via extract()" ;; *) esac else echo "'$1' is not a valid file" fi } ziprm () { if [ -f $1 ] ; then unzip $1 rm $1 else echo "Need a valid zipfile" fi } tarrm () { if [ -f $1 ] ; then tar -zxvf $1 rm $1 else echo "Need a valid tarfile" fi } psgrep() { if [ ! -z $1 ] ; then echo "Grepping for processes matching $1..." ps aux | grep $1 | grep -v grep else echo "!! Need name to grep for" fi } Alias Otro elemento del entorno son los alias, que como su nombre lo indica son comandos que podemos definir a nuestra conveniencia. Los alias definidos para el usuario se pueden visualizar con: alias Ejemplos Todos los alias se tienen que agregar a los archivos de inicio, generalmente ~/.bashrc. 78 Chapter 1. Índice biote-2016, Release alias alias alias alias alias alias alias alias alias alias alias alias alias ..='cd ..' ...='cd ../../...' Oblaka='cd ~/Documentos/Oblaka' Dropbox='cd ~/Documentos/Dropbox' R='R -q' cd..='cd ..' cp='cp -iv' df='df -h' dt='date +"%T"' fastqc2='fastqc --nogroup -f fastq' ffind='find . -iname' freedom='su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"' h='history' alias alias alias alias alias alias ll='ls -ltrhFGg' ls='ls -G --color=auto' lsd='ls -l | grep "^d"' lsf='ls -l | grep "^\-"' lt='ls -trh' mv='mv -iv' alias alias alias alias alias poweroff='su -c "systemctl poweroff"' reloadbash='source $HOME/.bashrc' restart='su -c "systemctl reboot"' shcpan='perl -MCPAN -e shell' update='sudo apt-get update && sudo apt-get upgrade"' Para impementar los cambios generados en ~/.bashrc se utiliza source: source $HOME/.bashrc #or source ~/.bashrc 1.6.4 Editores de texto Para editar los archivos del shell, así como otros archivos, ya sea de configuración o personales, se utilizan programas llamados editor de texto. Un editor de texto es diferente a un procesador de texto (Microsoft Office, LibreOffice, OpenOffice, Ashampoo Office) en que permite soporta sólo texto, sin ningún elemento que adicione formato ( \n, \r , \t ). Hay editores de texto con interfaz gráfica: gedit, kate, pluma, etc.) y editores de texto en la terminal (nano, vim, etc.). El más sencillo de utilizar es nano: nano /path/to/file Las opciones básicas son (el acento circunflejo es equivalente de Ctrl + : ^X ^O Cerrar el fichero mostrado / Salir de nano Escribir el fichero actual a disco Ahora, a practicar un poco. Agrega los alias y las funciones al archivo .bashrc. 1.6. Entorno 79 biote-2016, Release 1.7 Preprocesamiento 1.7.1 QC FastQC Para los pasos siguientes utilizaremos el siguiente set de prueba con lecturas pair-end de Illumina. mkdir $HOME/dataset && cd $HOME/dataset wget http://148.247.152.169/data/16data.tar.gz extract 16data.tar.gz && rm 16data.tar.gz cd 16data tree Cada archivo fastq tiene cuatro lineas: 1. Nombre de la secuencia (header - id del secuenciador, coordenadas del spot, flow-cell, adaptador, etc.) 2. Secuencia 3. Espaciador (+) 4. Valores de calidad: Q Score - alfanumérico. Dentro del folder $HOME/dataset/16Sdata/Fastq se encuentran los archivos que utilizaremos para el análisis de secuencias provenientes de amplicones. Para evaluar la calidad se podría conderar los archivos de manera individual pero eso consumiría ‘mucho tiempo’, por lo que es mejor tratarlo como un sólo archivo. Concatenamos todos los archivos fastq en un solo y ejecutamos el comando fastqc cd Fastq/ cat *.fastq > all.fq fastqc --nogroup -f fastq all.fq El resultado se encuentra en el archivo *html el cual se puede abrir con Firefox/Chrome/Opera. 1. Estadística básica 80 Chapter 1. Índice biote-2016, Release La estadística básica de las secuencias incluye el nombre del archivo, cuántas secuencias contiene, si algunos reads fueron etiquetados con una mala calidad. En este caso tenemos 1,080,000 secuencias, con un tamaño promedio de 150, un GC de 55% y ninguna lectura de mala calidad. 2: Calidad de secuencia por base La calidad de secuencia por base muestra la calidad de cada nucleótido. del 1 al 150 en este caso. Muestra esta información usando un gráfico de caja y bigotes para mostrarnos cuánta variación hay entre los reads. Idealmente desearíamos que todo el gráfico se concentrara en la región verde; lo cual se consideraría muy buena calidad. No es deseable que el gráfico se localice en las regiones naranja y roja. CUando el cuartil más bajo de cualquier posición es menor a 10 o la media es menor que 25, el módulo dará un warning. Cuando el cuartil más bajo de cualquier posición es menor a 5 o la media es menor que 20, el módulo dará un fail en este paso del control de calidad. 3: Calidad de secuencias de flowcell Es un heatmap del la calidad del flowcell mostrando celdas individuales. Si la figura es un sólido azul brillante la calidad del flowcell es consistentemente buena. Si hay parches de un azul más claro o de otro color, hay un problema asociado con alguna de las celdas ( como una burbuja o una mancha ) y esto puede corresponder con un decremento en la calidad de la secuencia en dichas regiones. En la gráfica se observan parches azul claro que indicaría problemas potenciales con la secuenciación en esas lineas. Sin embargo, en este caso las lecturas son lo suficientemente buenas para pasar el control de calidad; sería más preocupante si hubieran sido celdas color naranja o rojo. 1.7. Preprocesamiento 81 biote-2016, Release 4: Score de calidad por secuencia El score de calidad por secuencia representa la calidad de cada lectura. El eje y es el número de secuencias, y el eje x es la escala Phred, la cual está basada en una escala logarítmica. Un Predscore de 30 indica un ranto de error de 1 base en 1000, o una exactitud de 99.9%, mientras que un Phred score de 40 indica un rango de error de 1 base en 10,000, o una exactitud de 99.99%. Con un valor debajo de 27 se obtendrá un warning y por debajo de 20 se dará un fail. En nuestro ejemplo, el promedio de calidad es 37, lo cual es muy bueno. 5: Contenido de secuencia por base El contenido de secuencias por base muestra, para cada posición de cada secuencia, la composición de bases como 82 Chapter 1. Índice biote-2016, Release porcentaje para A, T, C y G. Este módulo obtendrá un warning si el contenido de base varía más del 10% en cualquier posición, y la muestra obtendrá fail si hay más de 20% de variación en cualquier posición, como en el ejemplo de las secuencias que estamos utilizando. Sin embargo, FastQC está diseñado para secuencias de genomas completos, pero nosotros utilizamos secuencias de 16S como input. Aunque tenemos una falla en este módulo, no es que haya algo malo con nuestras secuencias, es sólo que estamos usando secuencias que están enriquecidas en ciertas bases, más que secuencias completamente aleatorias provenientes de una secuenciación de genoma completo. 6: Contenido de GC por secuencia El contenido de GC por secuencia muestra el contenido total para todos los reads de acuerdo a la “distrbución teórica” de GC’s. El pico de la linea roja corresponde a la media de contenido GC de las secuencias, mientras que el pico de la linea azul corresponde a la media teórica de contenido de GC. Nuestro contenido de GC debería estar distribuido normalmente. Es de esperar cambios en los picos ya que el contenido de GC varía entre organismos, cualquier otra curva con una curva normal podría ser indicativo de contaminación. La forma del pico de la figura de arriba se debe al hecho de que hemos enriquecido una secuencia específica, así que esperaríamoa que la mayoría tenga aproximadamente el mismo contenido de GC. Se observa un warning si el 15% total de las secuencias caen fuera de la distribución normal. Se obtendrá un fail si más del 20% de las secuencias están fuera de la distribución normal. Los fails son generalmente debidos a contaminación, frecuentemente por secuencias de adaptadores. 1.7. Preprocesamiento 83 biote-2016, Release 7: Contenido de N por base El contenido de N por base muestra cualquier posición de las secuencias que no han sido ‘llamadas’ como A,T,C o G. Idealmente el contenido de N por base sería una linea plana en 0% sobre el eje y, indicando que todas las bases han sido ‘llamadas’. Se recibe un warning si el contenido de N es igual o mayor de 5%, y obtendrá un fail si el contenido de N es igual o mayor a 20%. Nuestras secuencias muestran el resultado ideal para este módulo. 8: Distribución de longitud de secuencias Este módulo simplemente muestra la longitud de cada secuencia en la muestra. Dependiendo de la plataforma de secuenciación usada la gráfica puede variar. Para secuenciación con Illumina, cada lectura debería ser del mismo 84 Chapter 1. Índice biote-2016, Release tamaño, con variación aceptable de una o dos bases. Para otras plataformas, se puede obtener una cantidad considerable de variación en el tamaño de las lecturas. Este módulo mostrará un warning si hay cualquier variación en la longitud de las secuencias, el cual puede ser ignorado si se sabe que es normal para el tipo de datos que se tiene. Una falla es este módulo significa que al menos una secuencia tiene longitud de 0. Nuestro ejemplo pasa este módulo ya que todas las secuencias tienen una longitud de de 150 sin variación alguna. 9: Niveles de duplicación de secuencias La gráfica de los niveles de duplicación de secuencias muestran en el eje x, el número de veces que una secuencia está duplicada, y en el eje y el porcentaje de secuencias que muestran ese nivel de duplicación. Normalmente un genoma tendrá un nivel de duplicación de secuencias de 1 a 3 para la mayoría de las secuencias, con sólo un puñado de lecturas teniendo un nivel más alto que este; la linea debería tener la forma inversa a una gráfica log. Un alto porcentaje de duplicación de secuencias es un indicativo de contaminación. Como utilizamos datos provenientes de secuenciación de 16S los datos parecen un poco confusos, el resultado observado es normal considerando las secuencias que tenemos. Este módulo nos dará un warning si más del 20% de las secuencias son duplicadas, y dará fail si más del 50% de las secuencias están duplicadas. Un warning o fail puede ser resultado de artefactos de PCR. 1.7. Preprocesamiento 85 biote-2016, Release 10: Secuencias sobre-representadas Si alguna secuencia se calcula que representa más del 0.1 % del genoma completo será etiquetada como una secuencia sobre-representada y se obtendrá un warning. La presencia de secuencias qque representan más del 1% del genoma dará como resultado que el módule falle, como se observa en este ejemplo. Estas secuencias sobre-representadas son observadas porque estamos viendo datos de 16S; si no vieramos estas secuenciassobre-representadas estaríamos en serios problemas. 11: Contenido de adaptadores Este módulo busca secuencias específicas de adaptadores. Una secuencia que representa más del 5% del total causará un warning en este módulo, y una secuencia que represente más del 10% del total causará una falla. Nuestro ejemplo no muestra contaminación con secuencias de adaptadores, lo cual es ideal. Si existiera un número significativo de secuencias de adaptadores, se debe utilizar un programa para recortarlos y realizar el análisis de calidad nuevamente. 86 Chapter 1. Índice biote-2016, Release 12: Contenido de K-mer En una librería completamente al azar, se podría observar cualquier k-mer de manera equitativa en cada posición (del 1-150 en este caso). En este módulo se reportará cualquier k-mer que esté enriquecido en algún sitio en particular. Si algún k-mer está enriquecido en un sitio específico con una p < 0.01, se obtendrá un warning. El módulo fallará si el k-mer está enriquecido en algún sitio con una p < 10^-5. Las secuencias de ejemplo fallan este módulo debido a que manejamos lectura de 16S. Al igual que con las secuencias sobre-represntadas esperamso ver k-mer*s bien representados por la alta conservación de las regiones 16S. En lectura no enriquecidas, es común ver *k-mers de secuencias altamente representadas cerca del principio de las secuencias si los adaptadores están presentes. 1.7. Preprocesamiento 87 biote-2016, Release ## NOTA: Borrar el archivo concatenado anteriormente: rm all.fastq FastQC Documentation. 1.7.2 Ensamble de lecturas Pandaseq Las secuencias que tenemos son secuencias de amplicones de 16s rRNA obtenidas con MiSeq. Utilizaremos Pandaseq para unir la lectura forward y reverse en una sola secuencia. Ejecutamos el comando: mkdir pandaseq_merged_reads pandaseq -F -f C01D01_1.fastq -r C01D01_2.fastq -w pandaseq_merged_reads/C01D01_pd.fastq -g pandaseq_ Veamos la estructura del comando: • pandaseq: script de pandaseq. • -F: habilitar archivo de salida en formato fastq. 88 Chapter 1. Índice biote-2016, Release • -f: archivo de lecturas forward. • -r: archivo de lecturas reverse. • -w: escribe la salida en formato fastq en el archivo *pd.fastq en el directorio pandaseq_merged_reads. • -g: archivo log del proceso. Si no se habilita esta opción el log saldrá en standard output (2>) haciendo un poco más lento el proceso. • -B: las secuencias input no contienen barcode. • -A: el algoritmo utilizado para el ensamble. • -L: especifica la longitud máxima de las lecturas ensambladas, (el tamaño del amplicón 150X150 de Illumina es de 253 bp) • -O: especifica la cantidad de sobrelapamiento permitido entre las secuencias forward y reverse. • -t: score de calidad entre 0 y 1 que cada secuencia debe de tener para que se mantenga en el archivo final. No es necesario repetir el comando para cada par de secuencias. Aplicaremos lo visto en la sección for-do-done. Copia en un editor de texto, guarda como *.sh, cambia el modo a ejecutable con chmod y ejecútalo en la carpeta Fastq, especificanto el número de procesadores a utilizar $1. Para verificar la lista de archivos que usaremos en el loop: ls *fastq | cut -d\_ -f1 | sort | uniq Ahora, lo enviamos a una lista: ls *fastq | cut -d\_ -f1 | sort | uniq > list.txt #!/bin/bash for i in $(<list.txt) do pandaseq -F -T $1 -f ${i}_1.fastq -r ${i}_2.fastq -w pandaseq_merged_reads/${i}_pd.fastq -g ${i}_ rm *log list.txt done O en una sola linea: for i in $(<list.txt); do pandaseq -F -T 4 -f ${i}_1.fastq -r ${i}_2.fastq -w pandaseq_merged_reads/$ Para revisar que el ensamble de las secuencias se haya hecho de forma correcta revisaremos los archivos y haremos nuevamente un análisis de calidad con FastQC: cd pandaseq_merged_reads && cat *pd.fastq > all.pd.fq fastqc --nogroup -f fastq all.pd.fq Comparar lecturas, antes y después: #Cuento cuántas secuencias tengo en el archivo C01D01_1.fastq expr $(cat C01D01_1.fastq | wc -l ) / 4 > 10000 #Cuento cuántas secuencias tengo y de qué longitud en el archivo C01D01_1.fastq cat C01D01_1.fastq | awk '{if(NR%4==2) print length($1)}' | sort -n | uniq -c > 10000 150 #Cuento cuántas secuencias tengo en el archivo C01D01_2.fastq expr $(cat C01D01_2.fastq | wc -l ) / 4 > 10000 1.7. Preprocesamiento 89 biote-2016, Release #Cuento cuántas secuencias tengo y de qué longitud en el archivo C01D01_2.fastq cat C01D01_2.fastq | awk '{if(NR%4==2) print length($1)}' | sort -n | uniq -c > 10000 150 expr $(cat C01D01_pd.fastq | wc -l ) / 4 > 7193 #Cuento cuántas secuencias tengo y de qué longitud en el archivo de panda C01D01_pd.fastq cat C01D01_pd.fastq | awk '{if(NR%4==2) print length($1)}' | sort -n | uniq -c > 7193 253 1.7.3 Recorte de lecturas En este caso en particular, las secuencias no tienen adaptador y tienen la misma longitud. En otros casos, como en lecturas provenientes de 454 y Ion Torrent, es necesario cortar las secuencias a una misma longitud y eliminar los adaptadores. Trimmomatic Como script: for i in *fastq do name=$(basename "$i" .fastq) #Define la variable name con el nombre del archivo, sin la extensión trimmomatic SE -phred33 $i $name.trimm.fastq MILEN:150 CROP:200 #Single End, input, output, longitu done Como una sola linea: for i in *fastq; do name=$(basename "$i" .fastq); trimmomatic SE -phred33 $i $name.trimm.fastq MINLEN 1.7.4 Sub-muestra Una de las limitantes de los análisis de 16S es el hardware con el que se dispone para realizar los análisis. Para fines prácticos utilizaremos sólo 1000 lecturas por muestra. Si es posible, realizaremos el mismo análisis con el total de lecturas, si la infraestructura de cada computadora lo permite. Usaremos Seqtk para obtener sub-muestras. Elegiremos 1000 lecturas al azar de cada una de las muestras. En el folder pandaseq_merged_reads ejecutamos la siguiente linea: seqtk sample -s 100 C01D01_pd.fastq 1000 > C01D01_pd1k.fastq Para todas las muestras escribe el código para for-do-done y que el output sea una carpeta llamada subset_qiime. El siguiente paso lo realizaremos con dicha secuencias. ls *pd.fastq | cut -d\_ -f1 | sort | uniq > list_pd.txt for i in $(<list_pd.txt); do seqtk sample -s 100 ${i} 1000 > ${i}\_pd1k.fastq ; done #Crear un subdirectorio y mover las lecturas obtenidas con seqtk mkdir subset_qiime && mv *pd1k.fastq subset_qiime 90 Chapter 1. Índice biote-2016, Release 1.7.5 QIIME QIIME™ (chime) - Quantitative Insights Into Microbial Ecology- Es una linea de procesos bioinformáticos de codigo abierto para realizar análisis de microbioma amplicones de 16S rRNA, provenientes de diferentes plataformas de secuenciación. Archivo de metadatos El archivo de metadatos (mapping file) es generado por el usuario, en un formato *tsv. Este archivo contiene toda la información de las muestras necesaria para realizar el análisis de datos. Para este tutorial usaremos el archivo fasting_map_combine que está en $HOME/dataset/16Sdata/MappingFile. A continuación se muestra las primeras lineas del archivo. La primer columna siempre es el #SampleID, seguido de las secuencias barcode para cada muestra y el adaptador para el secuenciador. Las demás columnas corresponden a los diferentes metadatos que se van a utilizar en el análisis, ya sea tratamiento, réplica, descripción, entre otros. Los nombres de los metadatos deben estar en caracteres alfanuméricos. #SampleID C01.R1.D01 C01.R1.D02 C01.R1.D03 C02.R1.D01 C02.R1.D02 C02.R1.D03 BarcodeSequence LinkerPrimerSequence GGAGACAAGGGA C01 R1 AATCAGTCTCGT C01 R2 AATCCGTACAGC C01 R3 ACACCTGGTGAT C02 R1 TATCGTTGACCA C02 R2 TTACTGTGCGAT C02 R3 Sample D01 D02 D03 D01 D02 D03 Replicate C01D01_pd.fna C01D02_pd.fna C01D03_pd.fna C02D01_pd.fna C02D02_pd.fna C02D03_pd.fna Extraction C01_D01 C01_D02 C01_D03 C02_D01 C02_D02 C02_D03 Formato Mapfile: • Debe de ser un archivo delimitado por tabulador (*.tsv) • La primera columna debe ser “#SampleIDs” • SampleIDs alfanumerico o puntos. No debe contener ‘_’ • La última columna debe ser “Description” • Pueden ponerse columnas intermedias, las que sean necesarias • Si se realiza QC con QIIME es necesario tener las columnas “BarcodeSequence” y “LinkerPrimer” en segunda y tercera columna, respectivamente Demultiplexing y filtrado de calidad de lecturas cd $HOME/dataset/16Sdata/Fastq/pandaseq_merged_reads/subset_qiime ln -s ../../../MappingFile/fasting_map_combine . mkdir -p 00_raw/{a_qual,b_fasta} Fastq -> Fasta Los archivos se convierten a FASTA. Esto también lo puede hacer Pandaseq, sólo basta quitar la opción -F que habilida el output en Fastq, y obtendremos archivos Fasta por default. También se puede convertir utilizando con el script convert_fastaqual_fastq.py de QIIME. for i in ./*fastq do echo "Converting $i" convert_fastaqual_fastq.py -c fastq_to_fastaqual -f $i -o . mv *qual 00_raw/a_qual 1.7. Preprocesamiento 91 InputF biote-2016, Release mv *fna 00_raw/b_fasta/ mv $i 00_raw/ done Demultiplexing El demultiplexing es asociar a qué archivo corresponde los barcodes, los cuales corresponden a los amplicones que se secuenciaron; para ello utilizamos el archivo fasting_map_combine. add_qiime_labels.py -i 00_raw/b_fasta/ -m fasting_map_combine -c InputFileName -o combined_fasta count_seqs.py -i combined_fasta/combined_seqs.fna 1.7.6 Summary Get the dataset mkdir dataset cd dataset wget 148.247.152.169/data/16data.tar.gz tar -zxvf 16data.tar.gz cd 16data/Fastq Concatenate file cat *fastq > all.fq QC fastqc --nogroup -f fastq all.fq Get the list for Pandaseq ls *fastq | cut -d\_ -f1 | sort | uniq > list.txt rm *zip Run Pandaseq for all samples mkdir pandaseq_merged_reads for i in $(<list.txt); do pandaseq -F -T 4 -f ${i}_1.fastq -r ${i}_2.fastq -w pandaseq_merged_reads/$ QC for pandaseq output cd pandaseq_merged_reads cat *pd.fastq > all_pd.fq fastqc --nogroup -f fastq all_pd.fq rm *zip Subsample for i in *pd.fastq; do name=$(basename "$i" _pd.fastq); seqtk sample -s 100 $i 1000 > $name\_pd1k.fas 92 Chapter 1. Índice biote-2016, Release Qiime dir mkdir qiime_subset mv *pd1k.fastq qiime_subset cd qiime_subset ln -s ../../../MappingFile/fasting_map_combine . mkdir -p 00_raw/{a_qual,b_fasta} Fastq to fasta for i in *pd1k.fastq; do echo "Converting $i" ; convert_fastaqual_fastq.py -c fastq_to_fastaqual -f $ 1.8 Asignación taxonómica 1.8.1 Flujo de trabajo de QIIME Using QIIME to analyze 16S rRNA gene sequences from microbial communities 1.8. Asignación taxonómica 93 biote-2016, Release 94 Chapter 1. Índice biote-2016, Release 1.8.2 Asignación de OTUS De Novo Asignación de OTUs: pick_de_novo_otus.py -i combined_fasta/combined_seqs.fna -o otus_de_novo Identificación de secuencias quimeras: wget http://greengenes.lbl.gov/Download/Sequence_Data/Fasta_data_files/core_set_aligned.fasta.imputed identify_chimeric_seqs.py -m ChimeraSlayer -i otus_de_novo/pynast_aligned_seqs/combined_seqs_rep_set_ rm core_set_aligned.fasta.imputed Filtrar tabla de OTUS a partir de una tabla de OTUS: filter_otus_from_otu_table.py -i otus_de_novo/otu_table.biom -o otus_de_novo/otu_table_non_chimeric.b Ordenar tabla de OTUS: cat fasting_map_combine | cut -f1 > sample_id sort_otu_table.py -i otus_de_novo/otu_table_non_chimeric.biom -o otus_de_novo/otu_table_de_novo_sorte Gráficos de asignación taxonómica: ## Absoluta echo "summarize_taxa:absolute_abundance True" >> qiime_parameters_abs echo "plot_taxa_summary:type_of_file svg" >> qiime_parameters_abs echo "plot_taxa_summary:dpi 200" >> qiime_parameters_abs echo "plot_taxa_summary:chart_type bar" >> qiime_parameters_abs summarize_taxa_through_plots.py -i otus_de_novo/otu_table_de_novo_sorted.biom -o taxa_summary_abundan ## Relativa echo "plot_taxa_summary:type_of_file svg" >> qiime_parameters_rel echo "plot_taxa_summary:dpi 200" >> qiime_parameters_rel echo "plot_taxa_summary:chart_type bar" >> qiime_parameters_rel summarize_taxa_through_plots.py -i otus_de_novo/otu_table_de_novo_sorted.biom -o taxa_summary_abundan Closed Asignación de OTUs: echo "pick_otus:enable_rev_strand_match True" >> $PWD/otu_picking_params_97 echo "pick_otus:similarity 0.97" >> $PWD/otu_picking_params_97 pick_closed_reference_otus.py -i $PWD/combined_fasta/combined_seqs.fna -o $PWD/otus_closed_ucr97/ -p Ordenar tabla de OTUs: cat fasting_map_combine | cut -f1 > sample_id sort_otu_table.py -i otus_closed_ucr97/otu_table.biom -o otus_closed_ucr97/otu_table_closed_sorted.bi Gráficos de asignación taxonómica: 1.8. Asignación taxonómica 95 biote-2016, Release ## Abstoluta echo "summarize_taxa:absolute_abundance True" >> qiime_parameters_abs echo "plot_taxa_summary:type_of_file svg" >> qiime_parameters_abs echo "plot_taxa_summary:dpi 200" >> qiime_parameters_abs echo "plot_taxa_summary:chart_type bar" >> qiime_parameters_abs summarize_taxa_through_plots.py -i otus_closed_ucr97/otu_table_closed_sorted.biom -o taxa_summary_abu ## Relativa echo "plot_taxa_summary:type_of_file svg" >> qiime_parameters_rel echo "plot_taxa_summary:dpi 200" >> qiime_parameters_rel echo "plot_taxa_summary:chart_type bar" >> qiime_parameters_rel summarize_taxa_through_plots.py -i otus_closed_ucr97/otu_table_closed_sorted.biom -o taxa_summary_abu Open Asignación de OTUS: echo "pick_otus:enable_rev_strand_match True" >> ucrss_params echo "align_seqs:min_length 65" >> ucrss_params pick_open_reference_otus.py -i $PWD/combined_fasta/combined_seqs.fna -r $HOME/bin/qiime/db/gg_13_8_ot Ordenar tabla de OTUS: sort_otu_table.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax.biom -o otus_open_ucrss_usearch97/ Gráficos de asignación taxonómica: ## Abstoluta echo echo echo echo "summarize_taxa:absolute_abundance True" >> qiime_parameters_abs "plot_taxa_summary:type_of_file svg" >> qiime_parameters_abs "plot_taxa_summary:dpi 200" >> qiime_parameters_abs "plot_taxa_summary:chart_type bar" >> qiime_parameters_abs summarize_taxa_through_plots.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted.biom -o ## Relativa echo "plot_taxa_summary:type_of_file svg" >> qiime_parameters_rel echo "plot_taxa_summary:dpi 200" >> qiime_parameters_rel echo "plot_taxa_summary:chart_type bar" >> qiime_parameters_rel summarize_taxa_through_plots.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted.biom -o 1.8.3 Diversidad Parámetros: echo "alpha_diversity:metrics chao1,fisher_alpha,goods_coverage,observed_species,shannon,simpson,simp 96 Chapter 1. Índice biote-2016, Release De Novo Diversidad alfa: alpha_rarefaction.py -i otus_de_novo/otu_table_de_novo_sorted.biom -m fasting_map_combine -o adiv_de_ Rarefacción única: biom summarize-table -i otus_de_novo/otu_table_de_novo_sorted.biom -o otus_de_novo/otu_table_summary_ number=`cat otus_de_novo/otu_table_summary_table | grep Min | cut -d\: -f2 | sed 's/^ //g' | cut -d\. single_rarefaction.py -i otus_de_novo/otu_table_de_novo_sorted.biom -o otus_de_novo/otu_table_de_novo Diversidad beta: beta_diversity_through_plots.py -i otus_de_novo/otu_table_de_novo_sorted_$number\.biom -m fasting_map Diversidad beta Jackknifed: jackknifed_beta_diversity.py -i otus_de_novo/otu_table_de_novo_sorted_$number\.biom -t otus_de_novo/r Closed Diversidad alfa: alpha_rarefaction.py -i otus_closed_ucr97/otu_table_closed_sorted.biom -m fasting_map_combine -o adiv Rarefacción única: biom summarize-table -i otus_closed_ucr97/otu_table_closed_sorted.biom -o otus_closed_ucr97/otu_table number=`cat otus_closed_ucr97/otu_table_summary_table | grep Min | cut -d\: -f2 | sed 's/^ //g' | cut single_rarefaction.py -i otus_closed_ucr97/otu_table_closed_sorted.biom -o otus_closed_ucr97/otu_tabl Diversidad beta: beta_diversity_through_plots.py -i otus_closed_ucr97/otu_table_closed_sorted_$number\.biom -m fasting echo "Jackknifed beta diversity" jackknifed_beta_diversity.py -i otus_closed_ucr97/otu_table_closed_sorted_$number\.biom -t $HOME/bin/ Open Diversidad alfa: :: alpha_rarefaction.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted.biom -m fasting_map Rarefacción única: biom summarize-table -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted.biom -o otus_open_u number=`cat otus_open_ucrss_usearch97/otu_table_summary_table | grep Min | cut -d\: -f2 | sed 's/^ // single_rarefaction.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted.biom -o otus_open_ Diversidad beta: beta_diversity_through_plots.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted_$number\ Diversity beta Jackknifed: jackknifed_beta_diversity.py -i otus_open_ucrss_usearch97/otu_table_mc2_w_tax_open_sorted_$number\.bi 1.8. Asignación taxonómica 97 biote-2016, Release 1.8.4 Archivos biom Convertir archivos BIOM a JSON: biom convert -i otus_closed_ucr97/otu_table_closed.biom -o otus_closed_ucr97/otu_table_closed_json.bi Convertir archivos BIOM a TSV: biom convert -i otus_closed_ucr97/otu_table_closed.biom -o otus_closed_ucr97/otu_table_closed_tsv.bio 1.8.5 Alfa diversidad - Phyloseq En el directorio de OTU closed En R: library(phyloseq) library(ggplot2) biomfile <- paste0("otu_table_closed_json.biom") data.biom <- import_biom(biomfile, parseFunction=parse_taxonomy_greengenes) sdfile <- paste0('../fasting_map_combine') data.mapping <- import_qiime_sample_data(sdfile) Global <- merge_phyloseq(data.biom, data.mapping) GP <- prune_taxa(taxa_sums(Global) > 0, Global) sample_variables(GP) p = plot_richness(GP, x = "Description", color= "Description", p + geom_point(size = 3, alpha = 0.4) measures = c("Observed", "Chao1", "Sh GPst = merge_samples(GP, "Sample") sample_data(GPst)$Sample <- factor(sample_names(GPst)) p = plot_richness(GPst, x = "Sample", color = "Sample", p + geom_point(size = 3, alpha = 0.4) measures = c("Observed", "Chao1", "Shannon", 1.9 Asignación funcional PICRUST es una herramiente diseñada para predecir contenido metagenómico funcional de un gen marcador o genomas completos. PICRUST consiste en dos implementaciones: inferencia de contenido de genes e inferencia metagenómica. La inferencia de genes es proporcionada de manera precalculada por lo que nos enfocaremos en la inferencia metagenómica a partir de datos de El contenido de genes por muestra se realiza a partir de una tabla de OTUS y en una tabla de contenido de genes basada en OTUS. Los archivos de entrade deben de provenir de una aproximación closed u open 1.9.1 Closed reference NOTA: Picrust utiliza biom-format-1.3.1, mientras que QIIME 1.9 utiliza biom-format-2.1.5. Por esta razón utilizaremos el entorno virtual de python picrust_env. Convertir de la codificación de biom de HDF5 a JSON. 98 Chapter 1. Índice biote-2016, Release biom convert -i otus_closed_ucr97/otu_table_closed.biom -o otus_closed_ucr97/otu_table_closed_json.bi Iniciamos picrust_env (para biom-format-1.3.1) picrust_env Normalización de tabla de OTUS • PICRUSt: Normalizar tabla de OTUS por el número predicho de copias de 16S. normalize_by_copy_number.py -i otus_closed_ucr97/otu_table_closed_json.biom crust_closed/otu_table_closed_json_norm.biom -o pi- Asignación de funciones para el metagenoma predicho • PICRUSt: Predicción de KOs. predict_metagenomes.py -i picrust_closed/otu_table_closed_json_norm.biom crust_closed/otu_table_closed_json_norm_ko.biom -o pi- • PICRUSt: Colapsar datos jerárquicaCollapse de KOs a niveles de rutas KEGG. categorize_by_function.py -i picrust_closed/otu_table_closed_json_norm_ko.biom KEGG_Pathways -o picrust_closed/otu_table_closed_json_norm_ko_L3.biom -l 3 -c Finalizamos el entorno virtual picrust_env deactivate • Convertir biom al formato de STAMP. biom_to_stamp.py -m KEGG_Pathways picrust_closed/otu_table_closed_json_norm_ko_L3.biom > picrust_closed/otu_table_closed_json_norm_ko_L3.spf 1.9.2 Open reference La única diferencia con respecto a closed reference es que open reference debe filtar la tabla de OTUS, manteniendo sólo aquellos OTUS que hayan dado match con la base de datos de Greengenes. Es necesario realizar el siguiente paso. filter_otus_from_otu_table.py -i otus_open_us97/otu_table_mc2_w_tax_open.biom -o otus_open_us97/otu_t Luego procedemos de la misma manera que con closed reference: biom convert -i otus_open_us97/otu_table_mc2_w_tax_open_picrust.biom -o otus_open_us97/otu_table_mc2_ picrust_env normalize_by_copy_number.py -i otus_open_us97/otu_table_mc2_w_tax_open_picrust_json.biom -o picrust_o predict_metagenomes.py -i picrust_open/otu_table_mc2_w_tax_open_picrust_json_norm.biom -o picrust_ope categorize_by_function.py -i picrust_open/otu_table_mc2_w_tax_open_picrust_json_norm_ko.biom -l 3 -c deactivate biom_to_stamp.py -m KEGG_Pathways picrust_open/otu_table_mc2_w_tax_open_picrust_json_norm_ko_L3.biom 1.9. Asignación funcional 99 biote-2016, Release 1.9.3 STAMP Generar archivo de metadatos: cat fasting_map_combine | awk -v OFS='\t' '{ print $4, $6}' > metadata_stamp.tsv Ejecutar STAMP y cargar los archivos generados: Load data > Profile file | Group metadata file. Profile file: otu_table_closed_json_norm_ko_L3.spf Group metadata file: metadata_stamp.tsv 1.10 Install mkdir -p $HOME/bin mkdir -p $HOME/bin/R cat <<EOF >> $HOME/.bashrc if [ -d "\$HOME/bin" ] ; then export PATH="\$HOME/bin:\$PATH" fi EOF cat <<EOF >> $HOME/.bashrc tar -zxvf () { if [ -f \$1 ] ; then case \$1 in tar xzf \$1 ;; *.tar.bz2) tar zxzf \$1 ;; *.tar.gz) bunzip2 \$1 ;; *.bz2) rar x \$1 ;; *.rar) gunzip \$1 ;; *.gz) tar xf \$1 ;; *.tar) tar xjf \$1 ;; *.tbz2) tar xzf \$1 ;; *.tgz) unzip \$1 ;; *.zip) uncompress \$1 ;; *.Z) echo "'\$1' cannot be tar -zxvfed via tar -zxvf()" ;; *) esac else echo "'\$1' is not a valid file" fi } EOF echo "export R_LIBS=\$HOME/bin/R" >> $HOME/.bashrc echo "PATH=\"\$HOME/bin/perl5/bin\${PATH+:}\${PATH}\"; export PATH;" >> $HOME/.bashrc echo "PERL5LIB=\"\$HOME/bin/perl5/lib/perl5\${PERL5LIB+:}\${PERL5LIB}\"; export PERL5LIB;" >> $HOME/. echo 'export PS1="\[$(tput bold)\]\[\033[38;5;39m\]\u\[$(tput bold)\]\[\033[38;5;15m\]@\[$(tput bold) source $HOME/.bashrc FastQC Linux/Win cd $HOME/bin wget http://www.bioinformatics.babraham.ac.uk/projects/fastqc/fastqc_v0.11.5.zip tar -zxvf fastqc_v0.11.5.zip && rm fastqc_v0.11.5.zip chmod +x FastQC/fastqc && ln -s FastQC/fastqc . 100 Chapter 1. Índice biote-2016, Release Trimmomatic wget http://www.usadellab.org/cms/uploads/supplementary/Trimmomatic/Trimmomatic-0.36.zip tar -zxvf Trimmomatic-0.36.zip && chmod +x Trimmomatic-0.36/trimmomatic-0.36.jar ln -s Trimmomatic-0.36/trimmomatic-0.36.jar trimmomatic rm Trimmomatic-0.36.zip Pandaseq git clone http://github.com/neufeld/pandaseq.git/ cd pandaseq/ ./autogen.sh && ./configure && make && sudo make install sudo ldconfig && cd .. rm -rf pandaseq Si da un error de libpandaseq.so.[número], ejecutar: sudo ldconfig Seqtk git clone https://github.com/lh3/seqtk.git seqTK && cd seqTK sudo make && mv seqtk .. rm -rf seqTK Virtualenv sudo pip install virtualenv Dependencias R cat <<EOF > install_packages.R install.packages(c('ape', 'biom', 'optparse', 'RColorBrewer', 'randomForest', 'vegan', 'gplots'), rep source('http://bioconductor.org/biocLite.R') biocLite(c('DESeq2', 'metagenomeSeq', 'phyloseq', 'Heatplus')) q() EOF Install R packages Rscript install_packages.R rm install packages.R Dependencias QIIME: mkdir -p $HOME/bin/python/ && cd "$_" virtualenv qiime virtualenv picrust echo "alias qiime_env=\"source \$HOME/bin/python/qiime/bin/activate\"" | tee -a $HOME/.bashrc echo "alias picrust_env=\"source \$HOME/bin/python/picrust/bin/activate\"" | tee -a $HOME/.bashrc source $HOME/.bashrcq qiime_env pip install pip install pip install pip install pip -U setuptools numpy biom-format scipy pandas 'scikit-bio==0.2.3' 'cogent==1.5.3' 'matplotlib==1.3' Descargar QIIME 1.10. Install 101 biote-2016, Release cd $HOME/bin && mkdir -p qiime wget https://github.com/biocore/qiime/archive/1.9.1.tar.gz tar -zxvf 1.9.1.tar.gz && rm 1.9.1.tar.gz cd qiime-1.9.1 Instalar QIIME python setup.py build python setup.py install --prefix=$HOME/bin/qiime cd .. echo "export PATH=\$HOME/bin/qiime/bin:\$PATH" >> $HOME/.bashrc source $HOME/.bashrc Descargar Greengenes 18_8 mkdir -p $HOME/bin/qiime/db && cd "$_" wget ftp://greengenes.microbio.me/greengenes_release/gg_13_5/gg_13_8_otus.tar.gz tar -zxvf gg_13_8_otus.tar.gz rm *tar.gz Instalar QIIME deploy cd $HOME/bin git clone git://github.com/qiime/qiime-deploy.git git clone git://github.com/qiime/qiime-deploy-conf.git python qiime-deploy/qiime-deploy.py $HOME/bin/qiime_software/ -f $HOME/bin/qiime-deploy-conf/qiime-1. rm -rf $HOME/bin/qiime-deploy $HOME/bin/qiime-deploy-conf deactivate source $HOME/.bashrc Usearch61 cd $HOME/bin wget http://148.247.152.169/data/usearch61.tar.gz tar -zxvf usearch61.tar.gz rm usearch61.tar.gz STAMP sudo apt-get install libblas-dev liblapack-dev gfortran sudo apt-get install freetype* python-pip python-dev python-numpy python-scipy python-matplotlib pyth sudo pip install STAMP Picrust picrust_env mkdir picrust pip install 'numpy==1.5.1' pip install 'cogent==1.5.3' 'biom-format==1.3.1' wget https://github.com/picrust/picrust/releases/download/1.0.0/picrust-1.0.0.tar.gz tar -zxvf picrust-1.0.0.tar.gz rm picrust-1.0.0.tar.gz mkdir -p picrust-1.0.0/picrust/data wget ftp://ftp.microbio.me/pub/picrust-references/picrust-1.0.0/ko_13_5_precalculated.tab.gz -P picru wget ftp://ftp.microbio.me/pub/picrust-references/picrust-1.0.0/16S_13_5_precalculated.tab.gz -P picr cd picrust-1.0.0 python setup.py install --prefix=$HOME/bin/picrust 102 Chapter 1. Índice biote-2016, Release cd .. rm -r picrust-1.0.0 echo "export PATH=$HOME/bin/picrust/bin:\$PATH" >> $HOME/.bashrc echo "export PYTHONPATH=$PYTHONPATH:$HOME/bin/picrust/lib/python2.7/site-packages" >> $HOME/.bashrc git clone https://github.com/mlangill/microbiome_helper.git echo "export PATH=$HOME/bin/microbiome_helper:\$PATH" >> $HOME/.bashrc deactivate source $HOME/.bashrc 1.10. Install 103
© Copyright 2025