3  Filosofía Unix & Bash

Este módulo abacara una introducción a lo que es Unix, Shell y Bash, así como, consejos para trabajar en línea de comandos.

3.1 ¿Por qué Unix?

3.1.1 Origen e Historia

  • 1969: Sistema operativo desarrollodo inicialmente en AT&T Bell Labs (Ken Thompson, Dennis Ritchie)
  • 1973: Reescribido en C, permitiendo portabilidad
  • Evolución: BSD, System V, GNU/Linux, macOS

3.1.2 Filosofía Unix

  1. Principio de modularidad: Programas pequeños que hacen una cosa bien
  2. Composición: Conectar programas mediante pipes (|)
  3. Texto como interfaz universal: Formatos de texto plano para entrada/salida
  4. Ocultar complejidad: Interfaces simples que ocultan implementaciones complejas
  5. Principio KISS: “Keep It Simple, Stupid”
# Ejemplo clásico de filosofía Unix
grep "^>" secuencias.fasta | sort | uniq -c | sort -nr

3.2 ¿Por qué Shell?

3.2.1 El shell como entorno de trabajo

  • Interfaz fundamental: Acceso directo al sistema operativo
  • Automatización: Scripting para tareas repetitivas
  • Portabilidad: Disponible en prácticamente todos los sistemas Unix-like

3.2.2 Ventajas de Bash

  • Ubicuidad: Shell por defecto en la mayoría de distribuciones Linux
  • Potencia: Completo lenguaje de scripting
  • Personalización: .bashrc, aliases, funciones
  • Compatibilidad: Mejorado sobre sh tradicional

3.3 Principios básicos y ventajas

3.3.1 Principios fundamentales

Principio Descripción Ejemplo
Everything is a file Dispositivos, procesos, sockets como archivos /dev, /proc
Small is beautiful Programas pequeños y especializados grep, awk, sed
Filter pattern Programas que procesan entrada y producen salida cat file | sort
Preferir texto Texto plano como formato universal logs, configs
Rule of Silence No generar output innecesario -q/--quiet

3.3.2 Ventajas clave

Eficiencia

# Procesamiento eficiente de datos
awk 'NR % 4 == 1' archivo.fastq | sort | cut -c2- | sort | uniq -c | sort -rn | head -20

Automatización

# Backup automatizado
tar -czf resultados_alineamiento_$(date +%Y%m%d).tar.gz resultados/*.sam && scp resultados_*.tar.gz usuario@servidor:~

Portabilidad

# Script que funciona en múltiples sistemas
#!/usr/bin/env bash

Extensibilidad

# Crear comandos personalizados
alias ll='ls -alF'

3.3.3 Referencias rápidas en bash

  • Ctrl+C: Interrumpir comando
  • Ctrl+L: Limpiar pantalla
  • Ctrl+A: Ir al inicio de línea
  • Ctrl+E: Ir al final de línea
  • Ctrl+U: Borrar hasta inicio de línea
  • Ctrl+K: Borrar hasta final de línea

3.4 Casos de estudio

3.4.1 Pipeline clásico

# Analizar archivo FASTQ para obtener lecturas con baja calidad
seqkit fx2tab -q -n -i reads.fastq | awk '$2 < 30' | sort | uniq -c | sort -nr | head -10

3.4.2 One-liners

# Buscar archivos FASTQ y comprimirlos
find . -name "*.fastq" -exec gzip {} \; | xargs -I{} echo "Comprimido: {}"

# Monitorizar uso de memoria durante alineamiento
watch -n 1 'ps -C bwa -o %mem,%cpu,cmd'

3.5 Buenas Prácticas

3.5.1 Scripting robusto

#!/usr/bin/env bash
set -euo pipefail     # Falla ante cualquier error
IFS=$'\n\t'           # Maneja nombres con espacios

# Validar argumentos de entrada
if [[ $# -ne 2 ]]; then
  echo "Uso: ${0##*/} <input.fastq> <genoma_referencia.fa>" >&2
  exit 1
fi

# Procesamiento seguro de muestras
echo ">>> Alineando ${1} contra ${2}..."
bwa mem -t 4 "$2" "$1" | samtools view -bS - > aligned.bam

# Control de calidad del alineamiento
samtools flagstat aligned.bam > alignment_stats.txt
echo ">>> Resultados guardados en alignment_stats.txt"

3.5.2 Versión extendida con más controles

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

# Configuración sensible para datos biológicos
REF_GENOME="/data/genomes/hg38.fa"
THREADS=8
MIN_QUALITY=20

# Validación de entradas
required_tools=("bwa" "samtools" "seqkit")
for tool in "${required_tools[@]}"; do
  if ! command -v "$tool" &> /dev/null; then
    echo "ERROR: $tool no está instalado" >&2
    exit 1
  fi
done

# Procesamiento pipeline
process_sample() {
  local input_fastq="$1"
  local sample_name=$(basename "$input_fastq" .fastq)
  
  echo ">>> Procesando muestra: $sample_name"
  seqkit stats "$input_fastq" > "${sample_name}_qc.txt"
  
  bwa mem -t "$THREADS" "$REF_GENOME" "$input_fastq" \
    | samtools view -b -q "$MIN_QUALITY" - \
    | samtools sort -o "${sample_name}.sorted.bam"
  
  samtools index "${sample_name}.sorted.bam"
}

# Ejecución principal
process_sample "$@"

3.5.3 Consejos para usuarios

  1. Aprender expresiones regulares: grep -E, sed -E
  2. Dominar redirecciones: >, >>, 2>, &>
  3. Usar man: Documentación completa (man bash, man grep)
  4. Explorar herramientas estándar: awk, sed, cut, tr
  5. Versionar scripts: Usar Git incluso para scripts pequeños

3.6 Recursos adicionales