0% encontró este documento útil (0 votos)
7 vistas

Programación Con Shell Scripting

Cargado por

Chiki
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas

Programación Con Shell Scripting

Cargado por

Chiki
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 22

En linux, comando:

firefox https://www.ncbi.nlm.nih.gov/genome/guide/human/

Bajar a la seccion de descargas cuando cargue y obtener el enlace para el crom1. En linux, wget para
descargar el archivo desde el enlace:
https://ftp.ncbi.nlm.nih.gov/refseq/H_sapiens/annotation/GRCh38_latest/
refseq_identifiers/GRCh38_latest_genomic.fna.gz

Captura de pantalla: aplicaciones en esquina izq -> accesorios -> captura de pantalla: se puede
guardar o copiar a portapapeles

En workspace hay libreoffice, se puede utilizar para pegar archivos

Para acceder a onedrive:

Firefox - - search “microsoft 365”

Recursión-> -R : aplica el comando a un directorio específico y su contenido

Tree –L 1 –C –p: permite ver los permisos de cada directorio/archivo


Los controles se leen de 3 en 3: propietario, grupo y otros

Para cambiar permisos:

Sesión 3:
Sistema de directorios: si añades varias /// es irrelevante, lo lee como una sola

. = directorio actual

..=directorio padre

/ = raíz

Comando locate: se crea una base de datos sobre los directorios, y ahi busca el archivo que quieras

Por tanto, si quieres buscar un archivo que acabas de crear, dara error. Primero hay que actualizar
con: sudo updatedb

(update data base)


Comando find: es mucho mas especifico, podemos dirigirlo para que busque en un directorio
especifico. Tambien se puede buscar, ademas de por nombre, por tipo de archivo, tamaño, usuario,
permisos......

Si al nombre añadimos -i (ej: -iname) ignorara las mayusculas y minusculas

-type f = file

Aunque en general en las instrucciones las palabras completas se ponen con dos guiones (--), en el
comando find se utiliza uno solo (ej –name)

Para hacer dos busquedas:

find . -iname “*.jpg” - o –iname “*.mp3” --> te sacara los archivos que tengan de uno o de otro

Otra opción es repetir el comando y unirlos con &&:

find . -iname “*.jpg” && find . –iname “*.mp3”

Para buscar por tamaño, en vez de poner el tamaño concreto, podemos buscar tamaño mayor a
(+654k) o menor (-654k), indicando siempre la unidad de medida (ej k para kilobytes)

-exec deteermina que una vez encontrados los archivos especificados se ejecute el siguiente
comando para cada uno de ellos:

Ej: find . -iname "e*" -exec file {} \;

Comando file: indica el tipo de archivo

{} indica que actua sobre cada uno de los comandos encontrados

OJO: Para indicar que la instrucción se ha terminado, debemos añadir \; al final. Tambien se puede
sustituir por “;”

Comando touch: permite crear archivos vacios y modificar las marcas de tiempo de acceso y de
modificación, pero no de cambios realizados. No sobreescribe, si se utiliza sobre un archivo
existente, actualizara la hora de acceso y modificación

Con touch –t le indicamos la fecha y hora exacta que queremos

/dev/null :El agujero negro, es un archivo especial en el que si envias algo desaparece para siempre.

< redirije el contenido de un archivo al comando. En la mayoria no hace falta, pero para algunos
comandos es necesario. Ej: tr (traducir)

<< le dice a la shell que lea el documento hasta que llegue al termino indicado. Ej: cat << hello
permitira escribir hasta que llegue a la palabra hello

REPASAR LOS EJERCICIOS DE LA PRESENTACION, SON EJERCICIOS DE EXAMEN!!!


Sesión 4:
Ejecuciones concatenadas: conecta la salidad e un comando con la entrada de otro comando. Se usa
| para unir las acciones. Esto permite hacerlo en un paso y que no se creen y modifiquen tantos
archivos.

Los comandos intermedios, que estan entre otros dos, reciben el nombre de filtros.

Se pueden distinguir tres formas para concatenar: APLICABLE A CUALQUIER LENGUAJE DE


PROGRAMACIÓN. Estas 3 formas son:

- Estructuras de control secuenciales: las instrucciones se ejecutan una detras de la otra, en el


orden en que están escritas. A diferencia de las tuberias, las instrucciones se ejecutande
forma independiente, no actuan sobre la salida de la anterior. Por tanto, si una falla, las
otras seguiran funcionando. Se indican mediante ;. ej: cuando ciertos comandos tardan
mucho tiempo.

Si en una cadena, ponemos > name.txt, solo se guardara la ultima orden. Para poder guardar todos
los comandos, debemos incluirlos entre parentesis. Si una de las ordenes fallan, solo se guaradaran
los comandos que hayan funcionado. Para guardar los errores, 2>.

- Estr. De control condicionales: actúan como un bloque, y toman decisiones en función de si


un condición se cumple o no, en funcion de las ocndiciones. Ej: if-else, and/or.
o Operador logico Y (&&): para que se ejecute el comando 2, el comando 1 tiene que
haber terminado y diso exitoso.
o Operador logico O (||): el comando 2 solo se ejecuta si el comando uno no ha sido
exitoso, por lo que solo se ejecuta un comando u otro.
- Estr de cont. Iterativas o en bucle: se ejecuta un determinado bloque de diferentes
instrucciones una y otra vez mientras que se cumpla cierta condición. Cuando esta deja de
cumplirse, se sale del bucle. Ej: while, for.

EJERCICIO:

Leemos el archivo passwd: cat /etc/passwd

Este contiene una lista de todos los usuarios del pc.

Elk comando cat tambien permite crear un archivo y escribir en el. Con cat > name.txt. Podemos
escribir todas las lineas que euqeramos, y al acabar cntrol + d, par aque lo guarde. Luego lo podemos
abrir con cat.

Ademas, el comando tac (cat invertido) permite abrir el fichero al reves, empezando por la ultima
linea.

Cntr + A: ir a inicio de linea || cntrl + E: ir al final de la linea

Comando tee: permite enviar la salida a un archivo al tiempo que la muestra en pantalla.

Comando ping: para verificar la coexionq ue tenemos con un dispositivo o servidor, envia una
solicitud de respuesta y si tiene accesibilidad le da una respuesta. Seguira compribando hasta que la
paremos. Podemos interrumpir una orden mediante: cntrl + C
Comando join: permite combinar archivos de dos en dos, siempre que estos esten ordenados.

Comando diff: permite comparar dos archivos línea por línea. Por tanto, debemos ordenar los
archivos antes de compararlos, ya que si una linea esta en otro orden, nos daran diferencias.
Sesión 5:
Editor de texto: sublime

Comando sed: busca un determinado patron y lo sustituye por otro. S/kd/kid -> s = sustituir; kd =
patron que queremos modificar; kid = patron que queremos dejar

Coamndo sort: ordena los archivos. Para guardarlo en un archivo, ademas de hacerlo con >, tambien
tenemos la opción -o al final + nombre del archivo. -k n -> numero de la columna por la que
queremos ordenar. -h permite ordenar teniendo en cuenta el formato mas legible para humanos,
mezclando letras y numeros.

Ordenar cromosomas:

Comando seq (sequence): permite generar secuencias numericas, hasta el numero indicado. Si
ponemos dos numeros, ira del primero al ultimo. Si ponemos 3, el primero es el de inicio, el segundo
indica los saltos y el tercero el final.

Comando shuf (shuffle): crea secuencias aleatorias. La opcion –i permite indicar el rango de
numeros. -n le dice que cree n digitos. Los numeros no se repiten.

Comando df: nos da una idea del espacio total, ocupado y libre del pc. -h lo pone en formato mas
legible.

Comando uniq: omitir cadenas repetidas. Con –c cuenta las repeticiones. -d muestra las lineas que se
repiten. -u muestra las lineas que no se repiten. -i ignora las mayus-minus. NO DETECTA LINEAS
DUPLICADAS QUE NO SE ENCUENTREN EN LINEAS ADYACENTES -> HAY QUE ORDENAR CON SORT:
PREGUNTA EXAMEN

Comando tr: cambia caracter por otro, caracter por caracter. NO ACTUA SOBRE UN ARCHIVO
DIRECTAMENTE, NECESITA UTILIZAR < PARA REDIRIGIRLO. PREGUNTA DE EXAMEN

Para eliminar: opción -d

-c sustituye todos los caracteres menos los indicados. OJO también cambia el salto de linea del final.

Comando wc: tambien cuenta como caracter los saltos de linea. PREGUNTA DE EXAMEN

Echo –n elimina el salto de linea final

Al no tener salto de linea final, wc no lo reconocera como linea. Sin embargo cat –n la contara como
linea, por lo que deberiamos testear con ambas formas por si acaso.
Comando rev: te da la secuencia reversa. Util para poder generar la cadena reversa de una
secuencia.

Comando fold: permite separar una linea en varias según la longitud especificada. La longitud por
defecto es 80 caracteres, porque es la longitud recomendada por las guias de estilo. Para evitar que
corte palabras, opción -s.

Proyecto GENCODE: preparación para la siguiente sesión:

Es un proyecto que busca identificar y mapear todos los genes que ahora mismo se conocen de
todas las especies.
Sesión 6:
Proyecto GENCODE:

Accedemos a la carpeta genecode y antes de descomprimir el archivo, vamos a leer las primeras
lineas para ver que es el archivo correcto, antes de descomprimirlo: zcat file | head

Comando zcat: con –l podemos ver la información del tamaño comprimido y descomprimido.
Tambien del ratio de compresión: depende de la herramienta de compresión y el tipo de datos.
Cuando es 0% no significa que no esté comprimido, sino que no se conoce el ratio de compresión.

Para quitar los encabezamientos: grep –v “^#” file > newfile (gencode.v45.annotation.filter0.gff3) ->
para guardarlo en un nuevo archivo

Visualizamos las primeras lineas, y vemos que la info se divide en 9 colummnas. En aquellas que
aparece un pounto, quiere decir que no tenemos esa información, para no dejarlo en blanco.: 1-
cromosoma, 2- fuente de la info, base de datos utilizada, 3- que es (gen, exon, etc), 4- inicio, 5-fin, 6-
score (como de bien se ha podido caracterizar), 7- cadena (forward or reverse), 8-como se lee a nivel
de secuencia, 9- columna de atributos, donde encontramos la información adicional.

Para contabilizar cuantos datos de cada tipo tenemos podemos: cut –f3 gencode.filter0 | sort | uniq
–c

Para extraer las coordenadas de cada sección: cut –f1,4,5 genecode... >
genecode.v45.annotation.bed -> así creamos un archivo en formato bed

Sort –k: podemos indicarle el orden de las columnas por las que queremos que nos lo ordene: así
podemos ordenar los cromosomas y luego las secciones por las coordenadas de inicio -> sort –k1,2
–V file | head > mini_bed.bed

-V nos permite ordenar por valores que tienen numero y texto, permitiendo leer el numero dentro
de la palabra (ej chrom10)

Podemos cambiar los tabuladores por guiones, o por otros simbolos: tr “\t” “-” < mini_bed.bed

El comando history nos permite acceder a todos los comandos que hemos utilizado en la sesión.
Cada uno lleva asociado un valor, lo que nos permite utilizarlo por el valor, con: !valor

Podemos utilziar un atajo para buscar cualquier pallabra o comando utilizado: contrl + R

Para navegar entre ellas seguimos dando cntrl + R ; para salir, flecha abajo

PRESENTACIÓN DE LA PRIMERA ACTIVIDAD:

Se utilizan datos de cél B inmunitarias.

PROGRAMACIÓN EN SHELL SCRIPTING:

Shell: interprete de lineas de comando, es un intermediario entre el usuario y el kernel.


Script: es un guion de instrucciones que el shell interpretara en un orden determinado. Estos
guiones se pueden guardar en un archivo de texto plano, que posteriormente se puede ejecutar
para que el shell lleve a cabo estas instrucciones.

Esto es útil para automatizar procesos, minimizando los errores, o para estandarizar procesos y
compartirlos con otras personas. Podemos crear funciones para organizar los comandos de manera
estructurada, modular y formateada; esto nos permitirá llamar la función sobre diferentes archivos.

Comando bc: calculadora. Con la opcion –l habilitamos el uso de decimales.

¿por qué usar shell scripting? -> POSIBLE PREGUNTA DE EXAMEN BREVE

Podemos utilizar editores de texto basados en terminal: VIM para esta asignatura, ya instalado en
AWS. Vim adventures para aprender a moverse por vim.

Pluma es editor grafico ya instalado en AWS

Otros editores de texto mas potentes y user friendly: visual studio, sublime text (el que utiliza paula)
Sesión 7:
Partes básicas de un script: es un fichero de texto que contiene ordenes pra realizar una tarea
específica. Lo primero es indicar qué intérprete debemos utilizar. Para ello tenemos las extensiones
del archivo, ej: .py para python, .sh para shell, .bash para bash. Todo son tipos de archivo de texto
plano, pero esta extensión nos permite saber a simple vista el tipo de información que contiene el
archivo (ej: .fasta es texto, pero organizado en formato fasta).

La primera línea del sript debe empezar con #! (llamado shebang), que nos sirve para definir el
intérprete a emplear, utilizando la ruta en la que se encuentre. Ej: #!/usr/bin/bash

En ocasiones es adecuado indicar #!/usr/bin/env bash cuando no sabemos si bash está en una
carpeta específica, para indicarle que busque en el environment donde está bash.

Para conocer la ruta, podemos utilizar: which comando (ej: which bash), que sirve para ubicar el
ejecutable del programa.

El shebang no es obligatorio, pero es adecuado indicarlo siempre. Su uso depende de cómo


lancemos el script, como veremos más adelante. Siempre se recomienda utilizarlo, para que si lo
queremos compartir, el usuario sepa qué intérprete es más adecuado.

Las siguientes líneas son comentarios, en las que se informa de la fecha de escritura, y el directorio
con el que se está trabajando, así como cualquier otra información como el autor. Siempre empieza
por #, lo que hace que el programa no lo lea. Es aconsejable seguir las guías de estilo para cada
lenguaje. un ejemplo de guía es la plantilla de la presentación.

El último bloque sería el de código, donde se adicionan las instrucciones en un orden secuencial, ya
que se ejecutan línea por línea.

Variable: ubicación en la memoria del ordenador que permite almacenar un valor. Se puede
modificar, tanto dentro como fuera de nuestros scripts. Pueden contener valores de naturaleza muy
diversa, y son valores dinámicos, que pueden ir cambiando para ajustarse a las necesidades del
momento. Las variables se definen con = -> nombre_variable=valor_variable SIN ESPACIOS

Las variables se pueden asignar con o sin “, pero necesitamos ponerlas cuando hay símbolos (ej: / en
directorios), para que no lo interprete como caracteres especiales. De manera predeterminada, los
valores se identifican como cadenas de texto, incluidos los números. No es necesario indicarle el tipo
de variable (int, float, etc.).

Tipos de variables: específico de shell:

- Variables globales: son accesibles para cualquier proceso en ejecución, en el shell o


cualquier subshell.
- Variables locales: solo son accesibles en el shell o subshell en el que se definió.

El shell inicial es la que se ejecuta cuando se inicia sesión, que puede ejecutar cualquier comando
simple. A partir de esta se pueden generar diferentes shells hijas o subshell. Estas pueden servir para
ejecutar comandos agrupados, para ejecutar scripts de forma explícita o para ejecutar instrucciones
en segundo plano, en background, para ir lanzando comandos mientras seguimos ejecutando otros
comandos en la shell padre.

Dependiendo si estamos ubicados en la shell padre o la subshell podremos acceder a unas variables
u otras.
Varb locales: no permiten la comunicación entre shell padre e hijo, cada una tendrá sus propias varib
locales. Se declaran mediante =. nombre_variable=valor_variable SIN ESPACIOS, ya que sino bash lo
interpreta como un comando y dará un error. Para acceder a la variable, se utiliza el simbolo del
dolar: $nombre_variable.. Otra forma es mediante el uso de ${ }: ${nombre_variable}. Esta forma es
interesante para reportar el nombre de la variable y seguido otros caracteres, para imprimir la
variable seguido de cualquier otra información que queramos adicionar.

Podemos generar una subshell mediante el comando bash. Para salir de ella, el comando exit, nos
permite volver a la shell padre. El comando ps nos permite saber que procesos se están ejecutando
en la shell, lo que nos permite saber si estamos en la shell principal o en la subshell. NO CONFUNDIR
abrir una nueva shell con abrir un nuevo terminal, cuando abres un nuevo terminal estás en la shell
principal. Cada vez que salgas de la subshell, esta NO se almacena, sino que crearás una shell nueva.

Variables globales: se crean con el comando expport sobre una varb local. Podemos primero generar
la varb y luego export (nombre_varb=valor_varb \n export nombre_varb) o todo a la vez (export
nombre_varb=valor_varb).

Dentro de una subshell, podemos modificar el valor de una varb, poniendo el nombre de la varb y
=nuevovalor. Esta modificación será visible para esta subshell y todas las subshell que creemos a
partir de esta, pero no de la shell principal.

Podemos crear subshells anidadas, una subshell dentro de la subshell.

Las variables no son permanentes, cuando cerremos la terminal se pierden. LO QUE PASA EN BASH
QUEDA EN BASH.

Si creamos una variable en la subshell y la hacemos global y salimos a la shell padre, NO VEREMOS
LA VARIABLE, solo sera visible desde la shell que se crea y sus shell hijas. PREGUNTA DE EXAMEN.

Eliminar variables: unset nombre_varb.

Todas las shell tienen unos archivos de configuración: bash profile. Podemos incluir las variables que
queramos en estos archivos para hacer las variables permanentes, de manera que la prox vez que
abramos la shell estas variables seguirán ahí.

Variables de entorno global: hay ciertas variables que están predefinidas en linux. Puede haber
diferencias según la distribución, pero en general son las de la diapo. Son varb que cuando abrimos
la terminal ya están definidas, y siempre aparecerán. Podemos modificarlas según conveniencia. Se
indican siempre con el nombre de la varb en mayus.

Comando printenv: permite imprimir los valores de las variables de entorno específicas. Si indicamos
el nombre de la varb a continuación (sin símbolo $), vemos la varb específica, si no indicamos nada
nos imprime una lista de todas las verb de entorno.

Cuando creamos una variable local, esta lista no se modifica. Pero si creamos una variable global,
esta se almacena en la lista de printenv, y podremos verla con este comando. sin embargo, esta se
perdera de igual manera al cerrar el terminal.

Podemos generar variables numericas para realizar operaciones aritmeticas, aunque no es


demasiado recomendable, salvo para operaciones muuuuy sencillas. Y siempre con numeros
enteros, no entiende los decimales. Hay tres formas de pedirselo, en la diapo.
Podemos asociar el output de un comando a una variable, para poder trabajar con ella de manera
más fácil, sin necesidad de crear un archivo nuevo. Hay dos formas: output=$(comando) o
output=`comando` -> ACENTO GRAVE. La primera forma es la más utilizada.

Comando whoami: indica el nombre del usuario actual.


Sesión 8:
Para llamar un script: podemos moverlo al path donde se encuentran los comandos, para que lo
reconozca como uno, o podemos cambiar la forma en que lo llamamos.

Para ello, dos formas:

- Explicita: indicarle primero que shell queremos que lo ejecute, con bash archivo
- Implícita: con un punto en lugar de la shell, indicando que queremos que lo ejecute: .
Archivo
o También podemos hacerlo con ./archivo. Esta forma puede darnos error si no
tenemos permisos de ejecución. Para ello debemos cambiar los permisos con
chmod.

La forma excplicita ejecuta en una subshell. Cuando las variables están determinadas fuera del
script, de manera local, el script que se base en esas variables no funcionará, ya que la subshell no
tendrá acceso a las variables locales de la shell principal.

La forma implicita con punto, le indica que lo abra en la shell principal, por lo que no tenemos este
problema. Sin embargo, la forma implicita ./ actúa como la explicita, abriendolo en una subshell.

Para solucionarlo, deberiamos hacer un export de las variables locales para convertirlas en globales.

Otra opción para ejecutar los scripts, era agregarlo al path. Para ello, export PATH=$PATH:(directorio
del script) -> añadimos : antes del directorio para indicarle que queremos añadir el directorio
siguiente. Podemos agregar la ubicación antes de $PATH o después (siempre separado por : );
simplemente cambiamos el orden en el que lo va a mirar, de manera que si ponemos la nueva
ubicación al principio, empezara a buscar todos los comandos por ahi. Esta modificación no es
permanente, solo funcionará mientras mantenemos la sesión. Si abrimos otra terminal, se perderá la
modificación.

Par aque la modificación sea permanente, debemos agregar la modificación en el archivo que
contiene las variables predeterminadas que la shell lee al iniciarse:

- ~/.bashrc -> cuando trabajamos en remoto, ya que se lee cada vez que abrimos la terminal

- ~/.bash_profile -> cuando trabajamos en local, solo se lee una vez, cuando iniciamos sesión

- también está ~/.profile -> aunque funciona, paula recomienda utilizar los otros dos.

Todos estos son archivos ocultos, que podemos ver con ls –a. Son archivos de texto plano. Para
añadir la nueva ruta, podemos hacerlo mediante un editor de texto, o con echo “export
PATH=$PATH:(direccion nueva)” >> ~/.bashrc. Para que el cambio se aplique, habría que reiniciar la
terminal o bien utilizar el comando source ~/.bashrc

ESTOS ARCHIVOS SON MUY IMPORTANTES, ANTES DE MODIFICARLOS ES RECOMENDABLE HACER


UNA COPIA PARA NO CARGARNOS NADA.

*cuando instalamos una herramienta, con conda por ej, la ubicación de esta se añade
automaticamente a PATH durante la instalación, de manera que podemos ejecutar el programa
directamente en cuanto se instala
Variables especiales o parámetros:

Creamos un script para pacticar con las variables especiales. Para ello utilizamos el editor de texto
vim. Así hacemos: vim nombrescript.sh

Para añadir pulsamos i


#!/usr/bin/bash

echo "Filename:$0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Total numbers of args: $#"

echo $SECONDS
echo $RANDOM
echo $LINENO

Para salir: ESC para salir de editar y añadimos al final :x para guardar y salir de vim

Comando read: permite guardar la siguiente linea en una variable. Si tenemos mas palabras que
variables, la primera palabra se guardara en la primera variable y el resto en la siguiente

Para ver el número de caracteres de una variable: echo ${#variable} ->PREGUNTA EXAMEN
Sesión 9:
Podemos extraer subcadenas en una variable que ya tenemos definida, mediante ${cadena:posición
del caracter inicial:longitud de la subcadena} -> hay que tener en cuenta que la cuenta comienza
desde 0, no desde 1.

Ademas, podemos reemplazar partes de la cadena con: ${variable/subcadena/reemplazo}. Si antes


de la subcadena ponemos solo una barra, solo reemplazara la primera coincidencia. Si ponemos
dos //, reemplaza todas las coindicencias.

Expresiones regulares o regex: son una serie de caracteres especiales que nos permiten seleccionar
o encontrar patrones en un texto. Son muy útiles, pero su sintaxis se puede complicar mucho.

Para encontrar líneas vacías: ^$ -> para actividad 1

Clases de caracteres: MEMORIZARLAS PARA EL EXAMEN

Para que grep entienda las clases predefinidas, hay que poner doble corchete. grep: la sintaxis
de la clase de caracteres es [[:space:]], no [:space:]

Comando grep: busqueda de expresiones regulares en archivos de texto.


Sesión 10:
El comando grep se queda algo escaso para modificar archivos, es más de busqueda de patrones.
Para lo otro tenemos sed y awk. Awk no es un comando normal, es casi su propio lenguaje de
programación.

Comando sed: stream editor. Editor de texto. No hace cambios directamente en el archivo, para ello
tendremos que guardarlo. Opera línea a línea, es decir, lee una línea, la lleva a cabo y pasa a la
siguiente. Fue una de las primeras herramientas que dio soporte a las expresiones regulares.
Integrar las funciones de sed simplifica mucho las modificaciones de texto en los scripts.

Aunque no se le indique ninguna orden, debemos añadir siempre las comillas simples que
acompañan a las órdenes. Por defecto sed imprime todas las líneas por pantalla, pero si añadimos la
opción -n suprimimos esta característica. Esto significa que si utilizamos la orden ‘p’ de imprimir, nos
imprimirá la línea que le pidamos y también el archivo completo, por lo que debemos añadir -n para
evitar esto último.

Sed –n –e ‘2p’ -e ‘6p’ archivo es equivalente a poner: sed –n ‘2p;6p’ archivo, es decir, podemos
poner dos órdenes seguidas con punto y coma ;.

Sed ‘s’ va a cambiar la primera coincidencia de cada línea, para que cambie todas las coincidencias
tenemos que añadir g al final de la orden.

Con la opción -i podemos hacer modificaciones directamente en el original. Para evitar problemas,
podemos crear un archivo de respaldo, añadiendo una extensión a la opción -i. Ej: -i.back

Comando awk: es capaz de trabajar por campos dentro de las líneas, separados entre sí por espacios
o tabuladores, es decir, podría trabajar por palabras. Para cambiar el separador de campo por
defecto podemos indicar la opción -F y entre ‘comillas simples’ el separador que queremos.
Sesión 11:
Revisar udemy para cursos gratuitos, de awk.

La extensión bioawk de la herramienta awk permite analizar archivos de datos biológicos, como
fasta o fastq, sam y bam, permite extraer lecturas alineadas.

Listas, vectores o arrays: puede combinar valores de distinta naturaleza, desde archivos a nombres
alfanuméricos. Son valores secuenciales, se leerán de izq a dcha. No hay límite máximo de
elementos. El primer elemento está situado en posición 0, no 1. se declaran de dos maneras:

1- Crear la lista indicando el nombre seguido de = sin espacios y la lista entre paréntesis,
separando los elementos por espacios (si queremos que un elemento tenga nombre
compuesto de varias palabras, tenemos que indicar el nombre completo entre comillas).
2- Indicar el nombre de la lista y entre corchetes [] el valor del elemento, = y el nombre del
elemento (sin espacios). No es necesario crear el array vacío antes de empezar a añadir
elementos, se inicializa automáticamente (a diferencia de otros lenguajes de programación).

Para ver la lista podemos utilizar el comando echo: echo ${lista[elemento que queramos recuperar]}.
Para ver la lista completa, sustituimos el elemento por los símbolos @ o * (es lo mismo). Si
indicamos un valor de elemento superior al número de elementos de la lista, saldrá una línea vacía,
pero no da error, ya que bash no comprueba la longitud de la lista, simplemente nos dice que esta
posición está vacía (en otros lenguajes daría error).

Para agregar nuevos elementos, se hace como la segunda manera, indicando el nombre de la
lista[posición]=nuevoelemento. De igual manera podemos modificarlo. Si no le especificamos la
posición, añadiría los elementos que queramos al final, pero tenemos que añadir un + antes del
igual: lista+=(nuevovalor1 nuevovalor2 nuevovalor3). Así podemos añadir varios elementos a la vez.

Para unir dos listas: concatenado=(${lista1[@]} ${lista2[@]})

Para eliminar: unset lista[posición]. Si no le indicamos la posición nos eliminará la lista completa. OJO
aunque eliminemos un valor, la posición de los demás se mantiene. Es decir, si eliminamos el primer
elemento, el segundo elemento no pasará a ocupar su posición, sino que seguirá siendo el segundo.

Para ver el indice de cada posición, debemos añadir ! Antes del nombre de la lista cuando la
llammaos con echo: echo ${!lista[*]}

Para ver la longitud del array: echo ${#lista[*]}

Podemos generar listas grandes utilizando rangos. Ej: {a..z} sería todas las letras en minuscula. Para
crear una lista con todos los cromosomas: chrom=(chr{1..22} chrX chrY)

Bucles:

for loops: las instrucciones a realizar deben ir determinadas entre do y done, opcionalmente con
sangrado. Aunque el sangrado no es obligatorio (a diferencia de otros lenguajes como python), sí se
recomienda, para evitar confusiones en bucles anidados (bucles dentro de bucles).

Esto podemos hacerlo en un script con líneas separadas, pero también podemos hacerlo en la línea
de comando, separando las instrucciones con ;.
*ejemplo: Podemos crear un script con vim para ver una lista con todos los usuarios que aparecen
en el archivo /etc/passwd. Scritpt usuario.sh en carpeta shell
#!/usr/bin/bash
#
nombre=(`cat /etc/passwd | cut -d : -f1`)

for user in ${nombre[@]}


do
echo "El nombre de usuario es: $user"
done

Bucles de 3 expresiones o 3 términos: estos términos están encerrados con doble paréntesis, y las
exp separadas entre punto y coma. Estas exp son:

1- Inicializador: el valor inicial en el que empezamos


2- Condición: se continúa ejecutando el bucle mientras esta sea verdadera
3- Expresión de conteo:

c++ -> por cada elemento, se suma su valor. Es decir, significa sumatorio

c+=1 ->a cada elemento se le suma 1

c-=1 -> a cada elemento se le resta 1

OJO siempre se inicia en el inicializador, es decir, en el primer bucle no se suma ni se


resta nada.
Sesión 12:
Bucle while: a diferencia del bucle for, no sabemos cuantas veces se va a repetir el bucle. Cuidado:
en la sintaxis, debemos dejar un espacio en blanco entre los corchetes y las condiciones
establecidas.

Ejemplo: -gt = greater than (mayor que). Cuando hacemos comparaciones numéricas entre
corchetes debemos utilizar un tipo de comparación diferente a los símbolos >, <, ==, etc. Ya que
estos dan errores cuando van entre corchetes. Cuando hablamos de operaciones aritméticas,
debemos recordar que estas se ponen entre doble paréntesis, para que se puedan expandir.

Se recomienda utilizar while seguido de corchetes, pero también se puede poner con doble
paréntesis, y utilizando los metacaracteres de comparación. Sin embargo, se recomienda utilizar los
corchetes. Por tanto, hay que aprenderse los operadores de comparación. 🙁

-lt = less than; gt= greater than; le= less equal; ge= greater equal; -eq=equal; -ne= not equal

Forever while loop: es un bucle infinito, nunca para porque la condición siempre es cierta. Para
bloquearlo, podemos hacer ctrl + c

Si metemos una línea limitada por “ ” en un bucle for, la leera por palabras cuando estan separados
por espacioes, tabulaciones y saltos de línea, a pesar de estar entre comillas. Por tatno, si queremos
leer un archivo, lo pondra una línea por palabra. Esto se debe a la varriable de entorno IFS. Para
solucionarlo, podemos:

1- Modificar la variable de entorno: ej.: IFS=: se recomienda, antes de cambiarlo, guardar


la antigua en una variable OLD_IFS=$IFS, y tras acabar de trabajar con el nuevo valor,
restaurarlo: E¡IFS=$OLD_IFS
Para indicarle que ponga un salto de línea: $’\n’ ->el $ para indicarle que expanda, y entre
‘comillas simples’ para indicarle el salto, porq si lo ponemos entre “ “ va a entender los
caracteres tal cual.
2- También podemos hacerlo con un bucle while, creando un script que abra primero el archivo
con cat, y luego leyendolo con while read line. (diapo). O bien directamente haciendo el
comando while read, y abriendo el archivo con < file.
El comando while read entiende directamente que las líneas están separadas únicamente
por saltos, por lo que no tendremos que cambiar la variable IFS

Condicionales if: si la condición es cierta, realizaremos una acción, y si es falsa haremos otra. Se
escrible la condición entre corchetes con espacio, al igual que con while.

if [ condición ]

then

Comando

fi

*If se cierra siempre con fi, a diferencia de for y while que es con done.

Podemos concatenar condiciones con el metacaracter or: [ condicion1 ] || [ condicion2 ]


Los corchetes son en verdad una forma abreviada de indicar el comando test, que lo que hace es
evaluar la expresión que hay en el interior. Por tanto, podríamos hacer lo mismo con el comando
test.

Comando test: devuelve el valor 0 si la expresión es verdadera, y un número distinto !=0 si es falsa.
Si ponemos solo la expresión, no saldra nada. Para que nos reporte el resultado debemos añadir una
variable especial: $? Con echo, que reporta la salida del ultimo comando.

Por tanto, -gt, -lt, -eq, etc son todas opciones de comparacion numerica del comando test.

Cuando esta unida a if, primero test evalua la expresión y a partir de ahi if actuara de una manera u
otra.

Ademas de comparaciones numericas, podemos comparar caracteres o expresiones con ficheros.

Comparaciones de texto: cuando se compara texto se utilizan los operadores =, !=, >, <, -n y –z. > y <
comparan de manera lexicografica, es decir, las compara alfabeticamente de izq a dcha, es decir,
cual va delante y cual detras.

Si tenemos cadenas de mas de una palabra, aunque lo pongamos ente comillas, piensa que cada
palabra es un argumento. Si hacemos la comparación con [ $cadena1 = $cadena2 ] nos dara un
error. Para solucionarlo tenemos que forzarlo poniendo comillas en las cadenas: [ “$cadena1” =
“$cadena2” ].

Condicional if: podemos añadir un else para que haga otro comando si la condicion no se cumple.
También podemos hacer condiciones anidadas, con elif: significa else if condicion2...comando2, else
comando 3. cuando utilizamos un if tenemos que cerrarlo con fi, pero con elif podemos juntarlos
todos en un único fin fi.

Comandos basename/dirname: devuelven el nombre de fichero o de directorio donde esta el fichero


respectivamente. Es util por ej para sacar el nombre de todos los ficheros con cierta extension de
una carpeta, ej: basename downloads/*.bed
Sesión 13: tutoría final
Actividad 2: crear el directorio dentro de documentos. Si queremos realizar un script para resolver
alguna de las preguntas, tendrá que guardarse siempre en el directorio code.

Todo lo podemos hacer menos el porcentaje de GC de la pregunta 6, que tenemos que investigar un
poco como se hace.

Juegos de programación: ahorcado

Calendario de advento: cada día de navidad sale un pequeño reto para resolver con cualquier
lenguaje de programación. Se puede acceder a los de años anteriores, está guay para practicar.

Escape room de programación, muy cortito.

Juego de steam hacknet

Tenemos instalado en AWS el comando git, por lo que desde la url de la pag github podemos
clonarlo con git clone url.

También podría gustarte