7  Procesamiento de texto

El procesamiento de texto es fundamental en bioinformática. La mayoría de nuestros datos están en formato texto: secuencias FASTA, archivos de metadatos, resultados de análisis, logs de programas, etc. Dominar estos comandos te permitirá explorar y manipular datos de manera eficiente.

7.1 Visualización de Archivos de Texto

7.1.1 cat - Mostrar contenido completo

# Mostrar todo el contenido de un archivo
cat archivo.txt

# Mostrar múltiples archivos
cat archivo1.txt archivo2.txt

# Mostrar con números de línea
cat -n secuencias.fasta

Ejemplo:

# Ejemplo con archivo FASTA
cat multi.fasta

Resultado esperado:

>sequenceID-001 description
AAGTAGGAATAATATCTTATCATTATAGATAAAAACCTTCTGAATTTGCTTAGTGTGTAT
ACGACTAGACATATATCAGCTCGCCGATTATTTGGATTATTCCCTG
>sequenceID-002 description
CAGTAAAGAGTGGATGTAAGAACCGTCCGATCTACCAGATGTGATAGAGGTTGCCAGTAC
AAAAATTGCATAATAATTGATTAATCCTTTAATATTGTTTAGAATATATCCGTCAGATAA
TCCTAAAAATAACGATATGATGGCGGAAATCGTC
>sequenceID-003 description
CTTCAATTACCCTGCTGACGCGAGATACCTTATGCATCGAAGGTAAAGCGATGAATTTAT
CCAAGGTTTTAATTTG

Opciones útiles de cat:

  • -n: numerar líneas
  • -b: numerar solo líneas no vacías
  • -A: mostrar todos los caracteres no imprimibles
  • -s: comprimir múltiples líneas vacías en una

7.1.2 head - Mostrar las primeras líneas

# Primeras 10 líneas (por defecto)
head archivo.txt

# Primeras n líneas específicas
head -n 20 archivo.txt
head -20 archivo.txt  # Forma abreviada

# Múltiples archivos
head -5 *.fasta

Ejemplo:

# Ver encabezados de archivos FASTA
head -2 multi.fasta

Resultado esperado:

>sequenceID-001 description
AAGTAGGAATAATATCTTATCATTATAGATAAAAACCTTCTGAATTTGCTTAGTGTGTAT

Ejemplo:

# Verificar formato de archivo de calidad
head -4 fastq.fq

Resultado esperado:

@HWI-ST999:102:D1N6AACXX:1:1101:1235:1936 1:N:0:
ATGTCTCCTGGACCCCTCTGTGCCCAAGCTCCTCATGCATCCTCCTCAGCAACTTGTCCTGTAGCTGAGGCTCACTGACTACCAGCTGCAG
+
1:DAADDDF<B<AGF=FGIEHCCD9DG=1E9?D>CF@HHG??B<GEBGHCG;;CDB8==C@@>>GII@@5?A?@B>CEDCFCC:;?CCCAC

7.1.3 tail - Mostrar las últimas líneas

# Últimas 10 líneas (por defecto)
tail archivo.txt

# Últimas n líneas específicas
tail -n 15 archivo.txt

# Seguimiento en tiempo real (útil para logs)
tail -f analysis.log

# Empezar desde una línea específica
tail -n +100 archivo.txt  # Desde la línea 100 hasta el final

Ejemplo:

# Ver encabezados de archivos FASTA
tail -5 multi.fasta

Resultado esperado:

AAAAATTGCATAATAATTGATTAATCCTTTAATATTGTTTAGAATATATCCGTCAGATAA
TCCTAAAAATAACGATATGATGGCGGAAATCGTC
>sequenceID-003 description
CTTCAATTACCCTGCTGACGCGAGATACCTTATGCATCGAAGGTAAAGCGATGAATTTAT
CCAAGGTTTTAATTTG

Ejemplo:

# Verificar formato de archivo de calidad
tail -4 fastq.fq

Resultado esperado:

@OBIWAN:24:D1KUMACXX:3:1112:9698:62774 1:N:0:
TAATATGGCTAATGCCCTAATCTTAGTGTGCCCAACCCACTTACTAACAAATAACTAACATTAAGATCGGAAGAGCACACGTCTGAACTCAGTCACTGACC
+
CCCFFFFFHHHHHIJJJJJJJJJJJJIIHHIJJJJJJJJJJJJJJJJJJJJIJJJJJJIJJJJIJJJJJJJHHHHFDFFEDEDDDDDDDDDDDDDDDDDDC

7.1.4 less - Navegación avanzada de archivos

# Abrir archivo con navegación interactiva
less archivo.txt

# Abrir múltiples archivos
less archivo1.txt archivo2.txt

Comandos dentro de less:

  • Espacio: página siguiente
  • b: página anterior
  • j/k: línea siguiente/anterior
  • /texto: buscar hacia adelante
  • ?texto: buscar hacia atrás
  • n: siguiente coincidencia
  • N: coincidencia anterior
  • q: salir
  • h: ayuda

Ejemplo:

# Asegurate de estar en Neucr2
# Descomprimir un archivo .gz
gunzip -d Neucr2_GeneCatalog_CDS_20130412.fasta.gz

# Ejemplo con archivo grande de secuencias
less Neucr2_GeneCatalog_CDS_20130412.fasta

# Ver archivo con números de línea
less -N Neucr2_GeneCatalog_CDS_20130412.fasta

Alternativas a less:

  • more: similar pero menos funcional
  • most: versión más avanzada con colores

7.2 Redireccionamiento y Pipes

7.2.1 Operadores de Redireccionamiento

  • > : Redirigir salida (sobrescribir)
  • >> : Redirigir salida (anexar)
  • < : Redirigir entrada
# > 
cat sequences1.fasta > combined_sequences.fasta

# >> 
cat sequences2.fasta >> combined_sequences.fasta

# < 
sort < sample_list.txt

Ejemplo:

# Crear una lista de IDs
grep ">" Neucr2_GeneCatalog_CDS_20130412.fasta > IDs_CDS-fasta.txt

# Visualizamos las 5 primeras líneas
head -5 IDs_CDS-fasta.txt

Resultado inesperado:

>jgi|Neucr2|411|NCU10129T0
>jgi|Neucr2|412|NCU09901T0
>jgi|Neucr2|413|NCU09903T0
>jgi|Neucr2|414|NCU11134T0
>jgi|Neucr2|415|NCU09904T0

Ejemplo:

# Crear lista de archivos de Neurospora
ls Neucr2* > "files.txt"

# Vemos el archivo completo
cat files.txt

Resultado esperado:

Neucr2_AssemblyScaffolds.fasta.gz
Neucr2_AssemblyScaffolds_Repeatmasked.fasta.gz
Neucr2.filtered_proteins.BroadModels.gff3.gz
Neucr2_GeneCatalog_CDS_20130412.fasta
Neucr2_GeneCatalog_genes_20130412.gff.gz
Neucr2_GeneCatalog_proteins_20130412.aa.fasta.gz
Neucr2_GeneCatalog_proteins_20130412_GO.tab.gz
Neucr2_GeneCatalog_proteins_20130412_IPR.tab.gz
Neucr2_GeneCatalog_proteins_20130412_KEGG.tab.gz
Neucr2_GeneCatalog_proteins_20130412_KOG.tab.gz
Neucr2_GeneCatalog_proteins_20130412_SigP.tab.gz
Neucr2_GeneCatalog_transcripts_20130412.nt.fasta.gz

Ejemplo:

# Crear archivo de configuración
echo "threads=8" > config.txt
echo "memory=16G" >> config.txt
echo "output_dir=/results/" >> config.txt

Resultado esperado:

threads=8
memory=16G
output_dir=/results/

7.2.2 Pipes (|) - Conectar comandos

# Pipe básico: salida de un comando como entrada del siguiente
comando1 | comando2

Ejemplo:

# Contar número de secuencias en archivo FASTA
grep "^>" Neucr2_GeneCatalog_CDS_20130412.fasta | wc -l

Resultado esperado:

10785

Ejemplo:

# Ver secuencias ordenadas alfabéticamente y ver las primeras 5
grep "^>" Neucr2_GeneCatalog_CDS_20130412.fasta | sort | head -5

Resultados esperados:

>jgi|Neucr2|10000|NCU05018T0
>jgi|Neucr2|10001|NCU05017T0
>jgi|Neucr2|10002|NCU05016T0
>jgi|Neucr2|10003|NCU05015T0
>jgi|Neucr2|10004|NCU05014T0

7.3 Comandos Avanzados de Procesamiento

7.3.1 sort - Ordenar contenido

# Ordenamiento básico
sort archivo.txt

# Ordenamiento numérico
sort -n numeros.txt

# Ordenamiento reverso
sort -r archivo.txt

7.3.2 cut - Extraer columnas

# Extraer columnas específicas
cut -f1,3 archivo.tsv        # Columnas 1 y 3
cut -d',' -f2 archivo.csv    # Segunda columna de CSV
cut -c1-10 archivo.txt       # Caracteres 1-10

7.3.3 paste - Combinar archivos por columnas

# Combinar archivos lado a lado
paste file1.txt file2.txt

# Con delimitador específico
paste -d',' file1.txt file2.txt

7.3.4 tr - Transformar caracteres

# Convertir mayúsculas a minúsculas
tr 'A-Z' 'a-z' < archivo.txt

# Eliminar caracteres específicos
tr -d '\r' < archivo_windows.txt > archivo_unix.txt

# Reemplazar caracteres
tr ' ' '_' < nombres_con_espacios.txt

7.4 Casos de Uso Prácticos Avanzados

7.4.1 Análisis de archivos FASTA

# Crear archivo FASTA de prueba
cat > example_sequences.fasta << EOF
>sequence_1 Escherichia coli strain K12
ATCGATCGATCGATCGATCGATCGATCGATCGATCGATCG
GCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTA
>sequence_2 Salmonella enterica
TTCCGGAATTCCGGAATTCCGGAATTCCGGAATTCCGGAA
GGCCTTAAGGCCTTAAGGCCTTAAGGCCTTAAGGCCTTAA
>sequence_3 Bacillus subtilis
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
EOF

# Análisis básico del archivo FASTA
echo "=== Análisis de archivo FASTA ==="

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

# Listar nombres de secuencias
echo "Nombres de secuencias:"
grep '^>' example_sequences.fasta | cut -c2-

# Calcular longitud de cada secuencia
echo "Longitudes de secuencias:"
awk '/^>/ {if(seq) print header ": " length(seq); header=$0; seq=""; next} {seq=seq$0} END {print header ": " length(seq)}' example_sequences.fasta

# Composición nucleotídica
echo "Composición total:"
grep -v '^>' example_sequences.fasta | tr -d '\n' | fold -w1 | sort | uniq -c

7.4.2 Procesamiento de archivos de metadatos

cat > sample_metadata.tsv << EOF
sample_id   condition   batch   concentration   quality_score
sample_001  control 1   2.5 8.2
sample_002  treatment   1   3.2 7.9
sample_003  control 2   2.8 8.5
sample_004  treatment   2   3.1 8.0
sample_005  control 1   2.3 7.8
EOF

# Análisis de metadatos
echo "=== Análisis de metadatos ==="

# Mostrar estructura
echo "Primeras líneas:"
head -3 sample_metadata.tsv

# Contar muestras por condición
echo "Muestras por condición:"
tail -n +2 sample_metadata.tsv | cut -f2 | sort | uniq -c

# Calcular estadísticas de concentración
echo "Estadísticas de concentración:"
tail -n +2 sample_metadata.tsv | cut -f4 | sort -n | awk '
{
    values[NR] = $1
    sum += $1
}
END {
    print "Mínimo: " values[1]
    print "Máximo: " values[NR]
    print "Promedio: " sum/NR
    print "Mediana: " values[int(NR/2)]
}'

7.4.3 Pipeline de análisis de calidad FASTQ

# Crear archivo FASTQ de ejemplo
cat > example_reads.fastq << EOF
@read_1
ATCGATCGATCGATCGATCGATCGATCGATCGATCGATCG
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@read_2
TTCCGGAATTCCGGAATTCCGGAATTCCGGAATTCCGGAA
+
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
@read_3
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
EOF

# Análisis básico de archivo FASTQ
echo "=== Análisis FASTQ ==="

# Contar número de lecturas
echo "Número de lecturas: $(($(wc -l < example_reads.fastq) / 4))"

# Longitud de lecturas
echo "Longitud de primera lectura: $(sed -n '2p' example_reads.fastq | wc -c)"

# Primeros 5 IDs de lecturas
echo "Primeros IDs:"
grep '^@' example_reads.fastq | head -5

# Distribución de calidad (primera posición)
echo "Distribución de calidad (primera posición):"
awk 'NR%4==0' example_reads.fastq | cut -c1 | sort | uniq -c

7.5 Editor de Texto nano

7.5.1 Uso básico de nano

# Abrir archivo existente o crear nuevo
nano archivo.txt

# Abrir archivo en línea específica
nano +25 script.py

# Modo solo lectura
nano -v archivo.txt

Comandos básicos en nano:

  • Ctrl+O: Guardar
  • Ctrl+X: Salir
  • Ctrl+W: Buscar
  • Ctrl+K: Cortar línea
  • Ctrl+U: Pegar línea cortada
  • Ctrl+G: Ayuda

7.6 Consejos Avanzados y Buenas Prácticas

7.6.1 Manejo eficiente de archivos grandes

# Para archivos muy grandes, usar comandos optimizados
# En lugar de cat archivo_grande.txt | grep "patrón"
# Usar directamente:
grep "patrón" archivo_grande.txt

# Para procesar archivos línea por línea sin cargar todo en memoria
while IFS= read -r line; do
    # procesar línea
    echo "Procesando: $line"
done < archivo_grande.txt

7.7 Recursos Adicionales

7.7.1 Comandos relacionados útiles

# wc - contar líneas, palabras, caracteres
wc -l archivo.txt      # líneas
wc -w archivo.txt      # palabras  
wc -c archivo.txt      # caracteres

# uniq - eliminar líneas duplicadas consecutivas
sort archivo.txt | uniq

# comm - comparar archivos ordenados
comm -12 archivo1.txt archivo2.txt  # líneas comunes

# diff - comparar archivos
diff archivo1.txt archivo2.txt

7.8 Resumen de Comandos

Comando Función Ejemplo Bioinformático
cat Mostrar archivo completo cat sequences.fasta
head Primeras líneas head -10 reads.fastq
tail Últimas líneas tail -f analysis.log
less Navegador de archivos less large_genome.fasta
> Redirigir salida grep "^>" file.fasta > headers.txt
>> Anexar salida echo "done" >> log.txt
\| Pipe grep "gene" file.gff \| wc -l
nano Editor de texto nano analysis_script.sh
sort Ordenar sort -k2,2n annotations.gff
cut Extraer columnas cut -f1,4,5 variants.vcf