Linux es un sistema operativo parecido a Unix, el cual fue uno de los primeros sistemas operativos diseñados para las grandes computadoras que existían en 1969. Linux tiene muchas cosas en común con Unix, desde interfaces bastante arcaicas hasta su gran poder de ejecutar múltiples tareas conjuntamente, y aceptar a múltiples usuarios simultáneamente. La principal diferencia entre Linux y Unix es que el primero es totalmente libre y gratuito. Por lo que cualquier persona puede obtener Linux por internet e instalarlo en cualquier computadora que tenga.
Una gran ventaja de Linux es que es el sistema operativo más ampliamente usado para trabajo serio. Un dato interesante es que cerca del 97% de las 500 supercomputadoras más poderosas del mundo utilizan alguna variante de Linux como su sistema operativo (top500 lists). En lo que respecta el tema de este curso, la mayoría de las aplicaciones de bioinformática existen primero para Linux y solo a veces son re-codificados para Windows. Por último, aunque puede ser difícil de aprender, una vez que se sientan cómodos con Linux, podrán hacer uso de grandes computadoras, como el cluster del Langebio, o la supercomputadora del Cinvestav que forma parte de la Delta Metropolitana.
Para los que desean saber un poco más sobre Linux, pueden revisar la Wikipedia.
En Linux podemos hacer casi cualquier cosa desde una terminal, si sabemos cómo darle las instrucciones a la computadora. De hecho hay muchísimas cosas que solamente se pueden hacer desde la terminal. (Nota: el sistema operativo de Mac OSX se basa en una variante de Unix, y tiene una terminal con la que se puede trabajar prácticamente igual que si fuera un ambiente Linux)
El ícono para abrir la Terminal debe estar en la barra superior de sus escritorios. Están buscando
algo que se ve así:
Denle click para que se vaya abriendo.
Lo primero que debemos aprender a hacer es cómo movernos en la terminal. Por ejemplo, cómo encuentro el lugar donde tengo unos archivos importantes con los que quiero trabajar? Para ello tenemos que entender cómo están organizados los archivos en Linux:
Para averiguar dónde estamos al iniciar la Terminal, podemos usar el comando pwd, que viene de print working directory:
pwd
/home/usuario
(A lo largo de estas prácticas, usaremos las convenciones de arriba para indicar instrucciones que le deben dar a la computadora y el resultado que la computadora les puede dar.)
Ahora iremos viendo una serie de comandos básicos que vale la pena conocer. En las siguientes tablas primero se resume lo que hacen una serie de comandos:
| Comando | Significado | Ejemplos |
|---|---|---|
| ls | muestra el contenido de un directorio (list) | ls ls Desktop |
| mkdir | crea un directorio (make directory) | mkdir bioinfo |
| cd | cambia de directorio (change directory) | cd bioinfo cd |
| rmdir | elimina un directorio (remove directory) | rmdir bioinfo |
Prueben esos ejemplos. Pueden ver lo que hacen?
Ejercicios:Para esta parte va a ser conveniente tener una serie de archivos con los cuales trabajar. Les he puesto archivos que contienen la secuencia del genoma y la anotación de la α-proteobacteria Rhizobium etli. Estos archivos fueron descargados originalmente de ftp://ftp.ncbi.nlm.nih.gov/genomes/Bacteria/Rhizobium_etli_CFN_42_uid58377/ pero para bajarlos con mayor velocidad los pueden encontrar aquí: R_etli.
Para empezar, bajen el archivo NC_004041.fna. Probablemente van a tener que darle click con el botón derecho para poder guardarlo a un archivo en el lugar que uds quieran.
Para probar los siguientes comandos, asegúrense de estar en la misma carpeta donde guardaron el archivo. Recuerdan cómo mostrar los archivos del directorio actual?
OJO: en la terminal de Linux se puede usar algo llamado tab-complete. Funciona despues de escribir las primeras letras de un comando o nombre de archivo, presionas la tecla TAB y el resto del nombre de comando o archivo debe completarse solo.
| Comando | Significado | Ejemplos |
|---|---|---|
| cp | copia un archivo | cp NC_004041.fna NC_004041.fna.bk |
| mv | mueve un archivo (o renombra) | mv NC_004041.fna R_etli.fna |
| rm | elimina un archivo (remove) | rm NC_004041.fna.bk |
Notas:
Ahora veamos algunos comandos para accesar el contenido de los archivos.
| Comando | Significado | Ejemplos |
|---|---|---|
| cat | muestra todo el contenido de uno o mas archivos (concatenate) | cat R_etli.fna |
| head | muestra el principio de un archivo | head R_etli.fna |
| tail | muestra el final de un archivo | tail R_etli.fna |
| more | muestra el contenido de un archivo, pero progresivamente | more R_etli.fna |
Notas:
Ahora veamos algunos comandos un poco más interesantes. Muchas veces queremos saber el número de renglones que tiene un archivo, o el número de palabras, o el de letras. En Linux esto es muy sencillo usando el comando wc:
wc R_etli.fna
5305 5314 376652 R_etli.fna
Esto significa que el archivo tiene 5305 renglones, 5314 palabras o 376652 letras. Casi todos los comandos en Linux tienen argumentos que son como opciones para que el comando opere ligeramente diferente. Para el caso de wc tenemos algunas variantes para cuando solamente queremos obtener una de las cuentas:
wc -l R_etli.fna wc -w R_etli.fna wc -c R_etli.fna
Pueden ver lo que hacen estos argumentos?
Otro comando muy útil es grep (viene de 'global regular expression print' pero no nos preocupemos por eso ahora). Este comando nos permite buscar cualquier texto dentro de un archivo. Veamos algunos ejemplos:
grep "GGGGGGGGG" R_etli.fna
CGACCGGCGACCGGCGGCTTCGGCGGGGGGGGGAGCGCCGTTGGGGTCGACCGCATCTACGGGCTCTATC GAGCGCTTTGAGCGCGGACTAAAGACCCGGCGCGAAGTCTTGGGGGGGGGCTATGTTGATGCGTCGGTCA
El comando grep nos va a regresar todos los renglones del archivo que tengan el texto que buscamos.
grep ">" R_etli.fna
>gi|89255298|ref|NC_004041.2| Rhizobium etli CFN 42 symbiotic plasmid p42d, complete sequence
El archivo que estamos manipulando contiene una secuencia en el llamado formato FASTA. Este formato permite que un archivo contenga una o muchas secuencias, pero cada una debe empezar por un renglón con la descripción de la secuencia, y este renglon siempre debe empezar con el caracter >. Por lo tanto, es muy usual tener que usar una instrucción como la anterior, para revisar cuántas y cuáles secuencias contiene un archivo FASTA.
grep también tiene una serie de argumentos, para cuando queremos hacer algo un poquito más elaborado. Estas son algunas de las opciones más comunes:
grep -i "gggggggg" R_etli.fna grep -c "GGGGGGGG" R_etli.fna
El primero hace la búsqueda, pero ignorando mayúsculas y minúsculas. El segundo cuenta el número de renglones que contienen la palabra, en lugar de imprimir el contenido de los renglones.
Ejercicios:Linux permite encadenar varios comandos. Es decir, ejecutar uno y que el resultado sea tomando por un segundo comando y a su vez el resultado de este puede ser tomado por un tercer comando. Para ello separamos los comandos por el símbolo |. Veamos un ejemplo:
grep "transport" NC_004041.ptt | wc
30 388 2843
Lo que estamos haciendo, es ejecutar el comando grep primero (pruébenlo hasta antes del | si quieren). El resultado de ese comando, lo estamos enviando directamente al comando wc para contar los renglones, palabras y letras que tiene el resultado.
Otra manera en que podemos manipular los resultados es redirigirlos a un archivo nuevo. Es decir, si queremos guardar el resultado de uno o varios comandos encadenados, podemos hacerlo de la siguiente manera:
grep "transport" NC_004041.ptt > transport.txt
El símbolo > va a redigir toda la salida del comando hacia un archivo llamado transport.txt
Pueden ver el contenido de este nuevo archivo para confirmar que contenga lo que esperan.
Vamos a ver tres comandos más, que son útiles sobre todo sabiendo cómo encadenar comandos. El archivo .ptt que hemos estado usando tiene información en columnas:
head NC_004041.ptt
Rhizobium etli CFN 42 symbiotic plasmid p42d, complete sequence - 1..371254 336 proteins Location Strand Length PID Gene Synonym Code COG Product 86..469 - 127 21492964 - RHE_PD00001 - - hypothetical protein 616..1575 - 319 21492963 - RHE_PD00002 - - insertion sequence transposase 2393..3361 + 322 21492961 - RHE_PD00004 - COG2801L insertion sequence transposase 4408..5373 - 321 21492960 - RHE_PD00005 - COG1961L DNA resolvase 6041..7045 + 334 89255299 - RHE_PD00006 - COG0464O ATPase 7045..9516 + 823 21492958 - RHE_PD00007 - - hypothetical protein 9539..10087 - 182 21492957 - RHE_PD00008 - - hypothetical protein
Si queremos obtener solamente una o algunas de estas columnas, podemos usar el comando cut. Veamos unos ejemplos:
cut -f 1 NC_004041.ptt | head
Rhizobium etli CFN 42 symbiotic plasmid p42d, complete sequence - 1..371254 336 proteins Location 86..469 616..1575 2393..3361 4408..5373 6041..7045 7045..9516 9539..10087
Lo que hicimos fue obtener la columna 1 (-f se refiere a field que es el campo o columna), y en lugar de ver la columna completa en pantalla, la pasamos al comando head para mostrar solo la primera parte.
Nota:
Hay un comando en Linux para reordenar el contenido de un archivo o la salida de otro comando. Se llama sort y lo podemos usar así:
cut -f 8 NC_004041.ptt | sort
En la salida de esa instrucción hay mucha redundancia. Esto da pie a un comando llamado uniq que sirve para eliminar renglones repetidos, preservando solamente una copia única.
cut -f 8 NC_004041.ptt | sort | uniq | head
- 336 proteins COG COG0079E COG0108H COG0142H COG0143J COG0265O COG0288P COG0300REjercicio final:
| Comando | Significado | Ejemplos |
|---|---|---|
| pwd | muestra el nombre de la carpeta actual (print working directory) | pwd |
| ls | muestra el contenido de un directorio (list) | ls ls Desktop |
| mkdir | crea un directorio (make directory) | mkdir bioinfo |
| cd | cambia de directorio (change directory) | cd bioinfo cd |
| rmdir | elimina un directorio (remove directory) | rmdir bioinfo |
| cp | copia un archivo | cp NC_004041.fna NC_004041.fna.bk |
| mv | mueve un archivo (o renombra) | mv NC_004041.fna R_etli.fna |
| rm | elimina un archivo (remove) | rm NC_004041.fna.bk |
| cat | muestra todo el contenido de uno o mas archivos (concatenate) | cat R_etli.fna |
| head | muestra el principio de un archivo | head R_etli.fna |
| tail | muestra el final de un archivo | tail R_etli.fna |
| more | muestra el contenido de un archivo, pero progresivamente | more R_etli.fna |
| wc | cuenta palabras de un archivo (word count) | wc R_etli.fna wc -l R_etli.fna |
| grep | encuentra renglones que contengan lo que buscas (global regular expression print) | grep ">" R_etli.fna grep -c "GGGGGGGG" R_etli.fna |
| | | encadena comandos, enviando la salida de un comando a la entrada del siguiente | grep "transport" NC_004041.ptt | wc |
| > | envía la salida de un comando a un archivo | grep "transport" NC_004041.ptt > transport.txt |
| cut | extrae (corta) ciertas columnas de un archivo | cut -f 1,4 NC_004041.ptt | head |
| sort | ordena el contenido de un archivo o la salida de un programa | cut -f 8 NC_004041.ptt | sort cut -f 3 NC_004041.ptt | sort -n |
| uniq | regresa solamente las líneas únicas (elimina repetidos) | cut -f 8 NC_004041.ptt | sort | uniq |