Saltar al contenido principal
LibreTexts Español

1.8: Las corrientes estándar

  • Page ID
    55192
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    En capítulos anteriores, aprendimos que los programas pueden producir salida no solo escribiendo en archivos, sino también imprimiéndolos en el flujo de salida estándar. Para ilustrar mejor esta característica, hemos creado un programa simple llamado fasta_stats que, dado un nombre de archivo FASTA como su primer parámetro, produce estadísticas sobre cada secuencia. También veremos el archivo Pz_CDNAS.fasta, que contiene un conjunto de 471 secuencias de transcripción ensambladas de novo de Papilio zelicaon, y pz_CDNAS_Sample.fasta, que contiene solo las dos primeras.

    imagen

    Podemos ejecutar el programa fasta_stats (después de hacerlo ejecutable) con. /fasta_stats pz_cdnas_muestra.fasta.

    I.8_2_UNIX_96_FASTA_Stats_sample

    Con base en la información impresa, parece que la secuencia PZ7180000031590 tiene un contenido de GC (porcentaje de la secuencia compuesta por caracteres G o C) de 37.8%, tiene 486 pares de bases de largo, la secuencia de cinco pares de bases más común es ACAAA (ocurriendo 5 veces), y la repetición perfecta más larga tiene una longitud de 10 pares de bases, causada por el pentanucleótido ATTTA, ocurriendo dos veces.

    Al igual que hmmsearch, este programa escribe su salida a la salida estándar. Si quisiéramos guardar los resultados, sabemos que podemos redirigir la salida de standard out con el > redirect.

    I.8_3_Unix_97_Fasta_Stats_Sample_redirect

    Cuando ejecutamos este comando, sin embargo, vemos que aunque se haya creado el archivo de salida, ¡todavía se imprime texto en la terminal! Si usamos menos -S para ver el archivo pz_sample_stats.txt, vemos que parte de la salida ha ido al archivo.

    I.8_4_Unix_98_Fasta_Stats_Sample_Stdout_less

    Entonces, ¿qué está pasando? Resulta que los programas pueden producir salida (que no sea escribir en archivos) en dos flujos. Ya estamos familiarizados con la primera salida estándar, que por defecto se imprime en el terminal pero se puede redirigir a un archivo con >. El segundo, llamado error estándar, también se imprime por defecto en el terminal pero no se redirige con >.

    Por defecto, al igual que la salida estándar, el error estándar (también conocido como “error estándar” o “stderr”) se imprime en el terminal.

    Debido a que el error estándar generalmente contiene información de diagnóstico, es posible que no nos interese capturarla en su propio archivo. Aún así, si lo deseamos, bash puede redirigir el error estándar a un archivo usando la redirección 2>. [1]

    I.8_5_Unix_99_Fasta_Stats_Sample_Stdout_Stderr

    Podríamos representar gráficamente los programas y su producción como flujos de información alternativos:

    I.8_6_Central_Dogma_1

    Líneas de filtrado, entrada estándar

    A menudo puede ser útil extraer líneas de un archivo basado en un patrón. Por ejemplo, el archivo pz_sample_stats.txt contiene información sobre lo que describe cada columna, así como los datos en sí. Si queremos extraer todas las líneas que coinciden con un patrón en particular, digamos, unit:, podemos usar la herramienta grep (para Búsqueda global de Expresión Regular e Impresión), que imprime en líneas de salida estándar que coinciden con un patrón dado (o no coinciden con un patrón dado, si se usa el -v bandera): grep '' <pattern><file>. Para ilustrar, primero ejecutaremos fasta_stats en el archivo de entrada completo, redirigiendo la salida estándar a un archivo llamado pz_stats.txt.

    I.8_7_Unix_100_Fasta_Stats_All_Out

    Al mirar el archivo con menos -S pz_stats.txt, podemos ver que las líneas informativas así como las líneas que contienen datos se almacenan en el archivo:

    I.8_8_Unix_101_Fasta_Stats_all_less

    Para deshacernos de las líneas informativas, podemos usar grep para extraer las otras líneas buscando algún patrón que tengan en común; en este caso, la unidad de patrón: servirá. Debido a que grep imprime sus resultados a la salida estándar, necesitaremos redirigir la salida modificada a un archivo llamado, quizás, pz_stats.table para indicar su naturaleza tabular.

    I.8_9_Unix_102_Fasta_Stats_Table

    Esta vez, menos -S pz_stats.table revela solo las líneas deseadas.

    I.8_10_Unix_103_Fasta_Stats_Tabla_menos

    En lugar de ver el archivo con menos, también podemos contar el número de líneas presentes en el archivo con la herramienta wc, que cuenta el número de líneas, palabras y caracteres de entrada: wc<file>.

    Trabajar con la tabla de datos limpiados revela que nuestro programa produjo 21,131 caracteres divididos en 3,297 palabras entre 471 líneas de salida de datos.

    I.8_11_Unix_104_Fasta_Estados_Tabla_WC

    Este tipo de análisis basado en la línea de comandos puede ser bastante potente, especialmente porque muchos de estos programas, como less, grep y wc, pueden imprimir sus resultados en la salida estándar y leer la entrada desde una entrada estándar en lugar de desde un archivo . La entrada estándar es el mecanismo de entrada secundario para programas de línea de comandos (aparte de leer directamente desde archivos). Por defecto, la entrada estándar, o “stdin”, no se utiliza.

    ¿Cómo podemos obtener entrada a un programa en su entrada estándar? Resulta que la forma más fácil de hacerlo es redirigir la salida estándar de otro programa a él usando la redirección |, también conocida como “pipe”, (que se encuentra encima de la tecla Enter en la mayoría de los teclados). En este caso, los datos vienen en “a la izquierda”:

    I.8_12_Central_Dogma_2

    Para conducir esta casa, primero eliminaremos nuestro archivo pz_stats.table, y luego volveremos a ejecutar nuestro grep for unit: en el archivo pz_stats.txt, pero en lugar de enviar el resultado de grep a un archivo con la redirección >, lo dirigiremos directamente a la entrada estándar de wc con un | redirigir.

    I.8_13_Unix_105_Fasta_Estados_GREP_WC

    En este ejemplo, no hemos creado un nuevo archivo ni especificado un archivo para que wc lea; los datos se almacenan en un búfer temporal que es manejado automáticamente por el shell y el sistema operativo. El programa menos también puede leer desde la entrada estándar, así que si quisiéramos ver el contenido del grep sin crear un nuevo archivo, podríamos ejecutar grep 'unit: 'pz_stats.txt | less -S.

    Recordemos que el programa fasta_stats escribió su salida a standard out, y debido a que grep también puede leer desde la entrada estándar, podemos procesar todo el archivo FASTA sin necesidad de crear ningún archivo nuevo mediante el uso de múltiples búferes de este tipo:

    I.8_14_Unix_106_Fasta_Stats_GREP_WC2

    Cuando se ejecuta este comando, los resultados impresos por fasta_stats sobre error estándar seguirán siendo impresos en el terminal (ya que ese es el valor por defecto y no redireccionamos error estándar), pero los resultados de salida estándar se filtrarán a través de grep y luego se filtrarán a través de wc, produciendo la salida final de 471 líneas.

    En este punto, la naturaleza larga de los comandos y el hecho de que nuestra ventana terminal sólo sea tan amplia están dificultando la lectura de los comandos que estamos produciendo. Entonces, comenzaremos a romper los comandos sobre múltiples líneas al terminar los comandos parciales con barras inversas. Al igual que en los scripts de shell que escribimos al final del capítulo 6, “Instalar (Bioinformática) Software”, el uso de barras inversas permitirá al shell saber que no hemos terminado de ingresar al comando. Sin embargo, el shell bash indica que un comando abarca múltiples líneas mostrándonos un >, lo que no debe confundirse con el carácter de redireccionamiento que podríamos escribir nosotros mismos. En el siguiente ejemplo se muestra exactamente el mismo comando en una forma más legible disgregada sobre varias líneas, pero los caracteres resaltados no se han escrito.

    imagen

    Una cadena de comandos como la anterior, separada por caracteres de tubería, a menudo se llama “tubería”. Sin embargo, de manera más general, una canalización puede describir cualquier serie de pasos, desde los datos de entrada hasta los datos de salida (como en la serie Muscle/HMMER cubierta en el capítulo 6).

    Contando repeticiones AT simples

    Ampliemos la pequeña tubería de arriba para inspeccionar solo las repeticiones AT “simples”, es decir, aquellas que son la cadena “AT” repetida una o más veces. Podemos comenzar con lo que tenemos, pero en lugar de solo buscar unidad:, modificaremos el patrón para encontrar unidad:AT, y veremos qué obtenemos:

    I.8_16_Unix_108_Unidad_AT_1

    El resultado resultante es cercano a lo que esperábamos, pero no del todo completo, ya que este patrón también coincide con cosas como unit:ATT y Unit:ATG.

    I.8_17_Unix_109_unidad_at_1_out

    Probablemente queremos filtrar más la salida, pero ¿en base a qué patrón? En este caso, aquellas líneas que coinciden no sólo con unidad:AT, sino también con el término dinucleótido. En lugar de intentar producir un solo patrón complicado que haga este trabajo en un solo grep, podemos agregar otra llamada grep a la tubería.

    I.8_18_Unix_110_Unidad_AT_2_CMD

    Este comando da como resultado la salida que queremos:

    I.8_19_UNIX_111_UNIT_AT_2_out

    En lugar de ejecutar los resultados a través de menos -S, podríamos usar wc para contar las repeticiones AT simples (dinucleótidos). Aquí hay un concepto importante en juego, el del desarrollo iterativo, la idea de que a medida que nos acercamos a una solución, inspeccionamos los resultados y repetimos según sea necesario. El desarrollo iterativo es una buena estrategia para muchas áreas de la vida, pero es esencial y omnipresente en la computación.

    Una vez que hayamos decidido que nos gusta el pequeño proceso computacional que hemos creado, podríamos decidir encapsularlo y hacerlo repetible como un script shell, quizás llamado count_ATs.sh.

    I.8_20_Unix_112_unit_at_script

    El script anterior deberá hacerse ejecutable y colocarse en una ubicación referenciada por $PATH, al igual que el programa fasta_stats.

    Ejercicios

    1. Usa grep y wc para determinar cuántas secuencias hay en el archivo orf_trans.fasta sin crear ningún archivo temporal.
    2. ¿Cuántos encabezados de secuencia en el archivo orf_trans.fasta tienen el término “polimerasa”?
    3. Algunos de los encabezados de secuencia en orf_trans.fasta tienen la frase “ORF verificado” para indicar que el marco de lectura abierto ha sido verificado experimentalmente. Algunos también tienen el término “complemento inverso” para indicar que el ORF (marco de lectura abierto) está presente en la secuencia inversa del complemento de la descripción del genoma canónico. ¿Cuántas secuencias son ORF verificadas y no están en el complemento inverso?
    4. Los encabezados de secuencia en orf_trans.fasta tienen información sobre el cromosoma del que se originan, como Chr I o Chr II. ¿Cuántas secuencias hay presentes en el cromosoma I?

    1. Desafortunadamente, los shells tcsh y csh no pueden redirigir de forma nativa por separado stdout y stderr a los archivos. Una posible calzada se ve así: (. /fasta_stats pz_cdnas_sample.fasta > pz_sample_stats.txt) > & pz_sample_stats.err.txt. Este comando ejecuta dos redirecciones independientes; el uso de paréntesis hace que la redirección de stdout ocurra primero, luego la redirección adicional de stderr puede ocurrir a continuación. Cómo los shells compatibles con bash manejan la salida estándar y el error estándar es una de las principales razones por las que se prefieren sobre los shells más antiguos compatibles con csh.

    This page titled 1.8: Las corrientes estándar is shared under a CC BY-NC-SA license and was authored, remixed, and/or curated by Shawn T. O’Neil (OSU Press) .