8  Búsqueda Avanzada en Archivos y Directorios

La capacidad de buscar información específica en archivos y directorios es crucial en bioinformática. Ya sea buscando secuencias específicas, genes de interés, patrones en datos experimentales, o archivos perdidos en el sistema, estas herramientas te permitirán encontrar exactamente lo que necesitas de manera eficiente.

8.1 grep - Búsqueda de Patrones en Texto

grep (Global Regular Expression Print) es una herramienta fundamental para buscar patrones en texto. El comando grep encuentra e imprime líneas en archivos que coinciden con un patrón.

# Búsqueda simple
grep "patrón" archivo.txt

# Búsqueda insensible a mayúsculas/minúsculas
grep -i "patrón" archivo.txt

# Mostrar número de línea donde aparece el patrón
grep -n "patrón" archivo.txt

# Contar ocurrencias
grep -c "patrón" archivo.txt

# Invertir búsqueda (líneas que NO contienen el patrón)
grep -v "patrón" archivo.txt

Ejemplo:

# Buscar secuencias específicas
grep "ATCGATCG" example_sequences.fasta

Resultado esperado:

ATCGATCGATCGATCGATCGATCGATCGATCGATCGATCG

Ejemplo:

# Contar número de secuencias en archivo FASTA
grep -c "^>" example_sequences.fasta

Resultado esperado

3

Ejemplo:

# Buscar muestras control
grep -i "control" sample_metadata.tsv

Resultado esperado:

sample_001      control 1       2.5     8.2
sample_003      control 2       2.8     8.5
sample_005      control 1       2.3     7.8

8.1.1 Opciones Avanzadas de grep

# Buscar en múltiples archivos
grep "patrón" *.txt

# Buscar recursivamente en directorios
grep -r "patrón" directorio/

# Mostrar contexto (líneas antes y después)
grep -A 3 -B 2 "patrón" archivo.txt  # 3 después, 2 antes
grep -C 5 "patrón" archivo.txt       # 5 líneas de contexto

# Buscar palabras completas solamente
grep -w "gen" archivo.txt  # No coincidirá con "genoma"

# Buscar múltiples patrones
grep -E "patrón1|patrón2" archivo.txt

# Listar solo nombres de archivos que contienen el patrón
grep -l "patrón" *.txt

# Buscar secuencias que empiecen con ATG (codón de inicio)
grep "^ATG" coding_sequences.fasta

# Buscar anotaciones de genes en cromosoma específico
grep -w "chr1" annotations.gff

# Buscar errores en logs de análisis
grep -i -E "error|fail|exception" analysis.log

# Buscar muestras con alta calidad
grep -E "quality.*[8-9]\.[0-9]" sample_metadata.txt

8.1.2 Expresiones Regulares con grep

# Usar expresiones regulares extendidas
grep -E "patrón_complejo" archivo.txt

# Ejemplos de patrones útiles en bioinformática:

# Buscar secuencias que terminen en TAA, TAG, o TGA (codones de parada)
grep -E "(TAA|TAG|TGA)$" sequences.fasta

# Buscar IDs de muestra con formato específico (sample_001, sample_002, etc.)
grep -E "^sample_[0-9]{3}" sample_list.txt

# Buscar coordenadas genómicas (formato chr:inicio-fin)
grep -E "chr[0-9XY]+:[0-9]+-[0-9]+" coordinates.txt

# Buscar direcciones de email en metadatos
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt

# Buscar fechas en formato YYYY-MM-DD
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" experiment_log.txt

# Buscar números de acceso de GenBank
grep -E "[A-Z]{1,2}[0-9]{5,}" accession_numbers.txt

8.1.3 Casos Prácticos con grep

# Crear archivo de ejemplo para práctica
cat > sample_data.txt << EOF
>sequence_001 Escherichia coli K12 complete genome
ATGAAACGCATTAGCACCACCATTACCACCACCATCACCATTACCACAGGTAACGGTGCGGGCTGA
>sequence_002 Salmonella enterica serovar Typhimurium
ATGAGCAAACAGGAAAAAACCGTGTATATGGATTTACCCAGATGCATACGGCTTCTTGA
>sequence_003 Bacillus subtilis strain 168
ATGAAAAACATTCTGACGGACTGGCGTGAACGTCCGAAAGTGCTTCTTGAAGATGGA
Quality scores: sample_001=8.5, sample_002=7.2, sample_003=9.1
Date: 2024-03-15
Contact: researcher@university.edu
EOF

# Análisis con grep:

echo "=== Análisis con grep ==="

# 1. Contar secuencias
echo "Número de secuencias: $(grep -c '^>' sample_data.txt)"

# 2. Extraer nombres de organismos
echo "Organismos encontrados:"
grep '^>' sample_data.txt | cut -d' ' -f2-4

# 3. Buscar codones de inicio
echo "Secuencias que empiezan con ATG:"
grep -c '^ATG' sample_data.txt

# 4. Buscar muestras de alta calidad (>8.0)
echo "Muestras de alta calidad:"
grep -E "sample_[0-9]+=[89]\.[0-9]" sample_data.txt

# 5. Extraer información de contacto
echo "Contacto encontrado:"
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" sample_data.txt

8.2 find - Búsqueda de Archivos y Directorios

find es una herramienta poderosa para localizar (finder) archivos y directorios basándose en diversos criterios. Se diferencia de grep, que encuentra líneas en los archivos.

# Buscar por nombre
find /ruta/directorio -name "archivo.txt"

# Buscar insensible a mayúsculas
find /ruta/directorio -iname "*.fasta"

# Buscar por tipo
find /ruta/directorio -type f  # solo archivos
find /ruta/directorio -type d  # solo directorios

# Buscar en directorio actual
find . -name "*.fastq"

# Buscar todos los archivos FASTA
find ~/proyectos/ -name "*.fasta" -o -name "*.fa" -o -name "*.fna"

# Buscar archivos de secuenciación
find /datos/ -name "*.fastq.gz"

# Buscar directorios de resultados
find ~/análisis/ -type d -name "*results*"

# Buscar scripts de Python
find . -name "*.py" -type f

8.2.1 Búsqueda por Atributos

# Buscar por tamaño
find . -size +100M          # archivos mayores a 100MB
find . -size -1K           # archivos menores a 1KB
find . -size 50M           # archivos de exactamente 50MB

# Buscar por fecha de modificación
find . -mtime -7           # modificados en últimos 7 días
find . -mtime +30          # modificados hace más de 30 días
find . -newer archivo_ref  # más nuevos que archivo_ref

# Buscar por permisos
find . -perm 755          # permisos específicos
find . -executable        # archivos ejecutables

8.3 wc - Contar Líneas, Palabras y Caracteres

wc (word count) es una herramienta simple pero muy útil para obtener estadísticas básicas de archivos. Cuenta el número de líneas, palabras y caracteres de un archivo.

# Contar líneas
wc -l archivo.txt

# Contar palabras
wc -w archivo.txt

# Contar caracteres
wc -c archivo.txt

# Información completa (líneas, palabras, caracteres)
wc archivo.txt

# Múltiples archivos
wc -l *.txt

# Ejemplos en bioinformática:

# Contar secuencias en archivo FASTA
wc -l sequences.fasta  # Líneas totales
grep -c "^>" sequences.fasta  # Número de secuencias

# Contar lecturas en archivo FASTQ
echo "Número de lecturas: $(($(wc -l < reads.fastq) / 4))"

# Tamaño de archivos de secuencias
wc -c *.fasta | sort -n

# Contar genes anotados
wc -l annotations.gff

8.3.1 Análisis de Archivos FASTA

Ejemplo 1: Análisis de archivo FASTA

# Crear archivo de ejemplo
cat > sequences_example.fasta << 'EOF'
>seq_001|Escherichia_coli_K12|complete_genome|4641652_bp
ATGAAACGCATTAGCACCACCATTACCACCACCATCACCATTACCACAGGTAACGGTGCGGGCTGAACGGGTGAACGTACGTAATTAA
>seq_002|Salmonella_enterica_Typhimurium|chromosome|4857450_bp
ATGAGCAAACAGGAAAAAACCGTGTATATGGATTTACCCAGATGCATACGGCTTCTTGAACGTACGTAATTAG
>seq_003|Bacillus_subtilis_168|complete_genome|4215606_bp
ATGAAAAACATTCTGACGGACTGGCGTGAACGTCCGAAAGTGCTTCTTGAAGATGGAACGTACGTAATGA
>seq_004|Pseudomonas_aeruginosa_PAO1|complete_genome|6264404_bp
ATGACCACCATCACCACCATCACCATCACCATCACCATCACCGTACGTAATTAA
EOF

echo "=== Análisis de archivo FASTA ==="

# 1. Información básica
echo "Número total de secuencias: $(grep -c '^>' sequences_example.fasta)"
echo "Número total de líneas: $(wc -l < sequences_example.fasta)"

# 2. Extraer información de headers
echo -e "\nOrganismos encontrados:"
grep '^>' sequences_example.fasta | cut -d'|' -f2 | sort

# 3. Buscar secuencias con codón de inicio
echo -e "\nSecuencias que empiezan con ATG: $(grep -c '^ATG' sequences_example.fasta)"

# 4. Buscar secuencias con codones de parada específicos
echo -e "\nSecuencias que terminan con codón de parada TAA: $(grep -c 'TAA$' sequences_example.fasta)"
echo "Secuencias que terminan con codón de parada TAG: $(grep -c 'TAG$' sequences_example.fasta)"

# 5. Buscar tamaños de genoma
echo -e "\nTamaños de genoma:"
grep '^>' sequences_example.fasta | grep -E '[0-9]+_bp' | sed 's/.*|\([0-9]\+\)_bp/\1/' | sort -n

# 6. Buscar secuencias que contengan sitio específico
echo -e "\nSecuencias con sitio ACGT: $(grep -c 'ACGT' sequences_example.fasta)"

Ejemplo 2: Análisis de Anotaciones GFF

# Crear archivo GFF de ejemplo
cat > annotations_example.gff << 'EOF'
##gff-version 3
chr1    RefSeq  gene    1000    3000    .   +   .   ID=gene001;Name=insulin;biotype=protein_coding
chr1    RefSeq  mRNA    1000    3000    .   +   .   ID=transcript001;Parent=gene001
chr1    RefSeq  exon    1000    1200    .   +   .   ID=exon001;Parent=transcript001
chr1    RefSeq  exon    2800    3000    .   +   .   ID=exon002;Parent=transcript001
chr2    RefSeq  gene    5000    7000    .   -   .   ID=gene002;Name=glucagon;biotype=protein_coding
chr2    RefSeq  mRNA    5000    7000    .   -   .   ID=transcript002;Parent=gene002
chrX    RefSeq  gene    10000   12000   .   +   .   ID=gene003;Name=dystrophin;biotype=protein_coding
chrY    RefSeq  gene    15000   16000   .   +   .   ID=gene004;Name=sry;biotype=protein_coding
EOF

echo "=== Análisis de archivo GFF ==="

# 1. Contar diferentes tipos de elementos
echo "Genes: $(grep -c $'\tgene\t' annotations_example.gff)"
echo "mRNAs: $(grep -c $'\tmRNA\t' annotations_example.gff)"
echo "Exones: $(grep -c $'\texon\t' annotations_example.gff)"

# 2. Genes por cromosoma
echo -e "\nGenes por cromosoma:"
grep $'\tgene\t' annotations_example.gff | cut -f1 | sort | uniq -c

# 3. Genes en cromosomas sexuales
echo -e "\nGenes en cromosomas sexuales:"
grep -E "^chr[XY].*gene" annotations_example.gff | grep -o 'Name=[^;]*' | cut -d'=' -f2

# 4. Genes en cadena positiva vs negativa
echo -e "\nGenes en cadena positiva: $(grep $'\tgene\t' annotations_example.gff | grep -c $'\t+\t')"
echo "Genes en cadena negativa: $(grep $'\tgene\t' annotations_example.gff | grep -c $'\t-\t')"

# 5. Rangos de tamaño de genes
echo -e "\nTamaños de genes:"
grep $'\tgene\t' annotations_example.gff | awk '{print $5-$4+1}' | sort -n

8.4 Consejos y Buenas Prácticas

8.4.1 Mejores prácticas para búsqueda y manipulación de archivos

  • Usa comillas en grep para patrones complejos y prueba expresiones antes de aplicarlas en scripts automatizados.
  • find es más eficiente cuando se limita la profundidad de búsqueda y se usan criterios bien definidos.
  • Para conteo rápido, wc -l es clave, pero para archivos FASTA y FASTQ hay métodos específicos (grep -c "^>" y dividir líneas por 4).

8.4.2 Optimización y rendimiento

  • Usa grep -F para cadenas literales, grep -E para expresiones regulares avanzadas.
  • find con -exec cmd {} + ejecuta comandos eficientemente en múltiples archivos.
  • wc combinado con awk y sort ayuda a obtener estadísticas rápidas.

8.4.3 Bioinformática aplicada

  • Para FASTA, grep "^>" permite contar secuencias.
  • Para coordenadas genómicas, chr[0-9XY]+:[0-9]+-[0-9]+ facilita identificación de regiones.
  • Para análisis de grandes volúmenes de datos, considera ripgrep (rg) o fd como alternativas más rápidas.

8.4.4 Seguridad y mantenimiento

  • Nunca ejecutes rm directamente con find, revisa con -print antes.
  • Monitorea el espacio en disco y optimiza búsquedas evitando procesos innecesarios.
  • Documenta patrones y comandos clave para facilitar futuras búsquedas.

8.5 Resumen de Comandos

Comando Función Ejemplo Bioinformático
grep Búsqueda básica grep "ATCG" sequences.fasta
find Por nombre/extensión find ~/data/ -name "*.fastq.gz"
wc Líneas, palabras, caracteres wc genome_annotation.gff