1.9: Clasificación, Primera y Última Líneas
- Page ID
- 55201
\( \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}\)Continuando con los ejemplos fasta_stats
del capítulo 8, “The Standard Stream”, la séptima columna de la salida contiene la longitud de la repetición perfecta más larga, en caracteres.

¿Qué secuencia contiene la repetición perfecta más larga? Para responder a esta pregunta, podríamos considerar ordenar las líneas de acuerdo a esta séptima columna. (Primero, tendremos que eliminar las propias líneas de cabecera, lo que podemos lograr filtrando líneas que coincidan con #
usando la bandera -v
de grep, o grepping para unit:
, como en el capítulo 8.) Ingresa sort
, que s
orta líneas de un archivo de texto (o de entrada estándar) por columnas especificadas: sort
<file>or... | sort
.
Por defecto, ordena
por todas las columnas, comparando las líneas completas en “diccionario” u orden lexicográfico. Para ordenar por columnas específicas, necesitamos usar una sintaxis bastante sofisticada. Ilustraremos con una figura.

La utilidad sort
toma muchos parámetros potenciales, aunque los más importantes son los parámetros -k
que especifican las columnas por las cuales ordenar y cómo se debe hacer esa clasificación, y ocasionalmente el indicador -u
. Los parámetros -k
(clave) se consideran en orden; lo anterior especifica que la clasificación debe hacerse en las columnas 2 a 4 (conglomeradas en una sola “columna”), considerándolas en orden de diccionario, y ordenándolas a la inversa. En el caso de los vínculos, sólo la primera columna se considera en orden normal de diccionario, y en el caso de vínculos adicionales, la quinta columna se considera en orden numérico. [1] (La diferencia entre el orden n
y g
es que g
puede manejar entradas en notación científica como 1e-6
, pero generalmente se prefiere n
porque es más rápido y no está sujeto a pequeños errores de redondeo).
El indicador opcional -u
(que puede especificarse antes o después de las claves, o incluso mezclarse) especifica que después de que se consideren todas las claves, si todavía hay vínculos entre filas, entonces solo se debe emitir la primera fila. Solo genera líneas “únicas” de acuerdo con el orden general de clasificación.
Por defecto, sort
utiliza espacios en blanco como separador de columnas, aunque se puede cambiar (ejecutar man sort
para obtener más información). Para ver información sobre la repetición perfecta más larga, usaremos sort -k7,7nr
, indicando que deseamos ordenar solo en la séptima columna, en orden numérico inverso.

Las primeras líneas de salida indican que la repetición perfecta más larga es de 94 bases de largo y ocurre en la secuencia PZ805359
(el contenido GC de esta secuencia es 0
, porque está compuesta completamente por una repetición AT
larga).

Los resultados también indican que hay una serie de lazos; varias secuencias contienen repeticiones perfectas de longitud 18 pares de bases. Si solo quisiéramos reportar una secuencia por diferente longitud de repetición, podríamos intentar ordenar -k7,7nr -u
. Alternativamente, podríamos modificar nuestro tipo para ordenar secundariamente por contenido GC (segunda columna), ordenar -k7,7nr -k2,2g
.
Un truco útil es realizar dos tipos: uno que inicialmente ordena los datos según los criterios que se deseen, y otro que obtenga solo la primera línea de un grupo en función de criterios secundarios. Es posible que deseemos reportar solo la secuencia de contenido de GC más alta por diferente longitud de repetición, por ejemplo. Inicialmente podemos usar un sort -k7,7nr -k2,2gr
para ordenar por longitud de repetición y romper lazos por contenido de GC, dejando las secuencias de mayor contenido de GC en la parte superior. A partir de ahí, podemos usar un sort -k7,7nr -u
para reordenar los datos (¡aunque ya estén ordenados!) por la séptima columna, manteniendo solo la línea superior por longitud de repetición.

Salida:

Sin embargo, hay una pequeña preocupación: ¿cómo podemos estar seguros de que nuestro cuidadoso pedido por contenido de GC no se deshizo en el segundo tipo? Después de todo, el segundo tipo sería técnicamente libre para reordenar los lazos de acuerdo con la séptima columna, resultando en una salida incorrecta. Hay una bandera adicional para sort
, la bandera -s
, que indica que se debe usar la clasificación estable. La clasificación estable significa que, en el caso de las ataduras, los elementos se dejan en su orden original. Entonces, para estar seguros, podríamos usar una especie secundaria de tipo -k7,7nr -u -s
, aunque una lectura cuidadosa de la documentación para sort
indica que en la mayoría de los sistemas la bandera -u
implica la bandera -s
.
Primera y Última Línea
A menudo deseamos extraer de un archivo (o de una entrada estándar) las primeras o últimas líneas. La cabeza
y la cola
de las herramientas están diseñadas para hacer exactamente esto, y en combinación con otras herramientas son sorprendentemente útiles. La herramienta cabezal
extrae las primeras líneas de un archivo o entrada estándar: head -n
<number><file>o... | head -n
<number>. La herramienta cola
extrae las últimas líneas de un archivo o entrada estándar: tail -n
<number><file>o... | tail -n
<number>.
Las utilidades de cabeza
y cola
, como las otras cubiertas anteriormente, escriben su salida en la salida estándar, y así se pueden usar dentro de tuberías. A menudo se emplean para inspeccionar el inicio o el final de un archivo (para verificar resultados o formatear). También suelen extraer conjuntos de datos de prueba. Por ejemplo, head -n 40000 input.fastq > test.fastq
extraería los primeros 10,000 registros de secuencia de input.fastq
y produciría test.fastq
(porque cada cuatro líneas de un archivo de secuencia FASTQ representa información para una sola secuencia).

Lo anterior muestra las primeras 12 líneas de un archivo FASTQ generado en un Illumina HiSeq 2000. La primera línea de cada conjunto de cuatro representa un identificador para la secuencia leída, la segunda línea contiene la secuencia misma, la tercera línea a menudo no se usa (conteniendo solo un +
, aunque puede ser seguida por el identificador y otros datos opcionales), y la cuarta línea contiene la “calidad” de cada base en la secuencia codificada como un carácter. (La codificación ha variado en el pasado, pero en los últimos años, las compañías de secuenciación han estandarizado la codificación utilizada por las máquinas de secuenciación Sanger).
Con un poco de sintaxis modificada, tail
también se puede usar para extraer todas las líneas de un archivo comenzando en una línea dada. Como ejemplo, tail -n +5 input.fastq > test.fastq
resultaría en test.fastq
teniendo todo menos el primer registro de secuencia de input.fastq
(es decir, comenzando en la quinta línea). Esta característica es especialmente útil para eliminar líneas de encabezado de salida o archivos antes de su posterior procesamiento, como en. /fasta_stats pz_cdnas.fasta | tail -n +9
, en lugar de usar grep -v '#'
arriba.
Ejercicios
- Ejecutando
fasta_stats
enpz_cdnas.fasta
, la séptima columna representa la longitud de la repetición perfecta más larga que se encuentra en cada secuencia. Use sologrep
,sort
,wc
,head
ytail
para determinar el valor mediano en esta columna. (Es posible que deba ejecutar varios comandos o canalizaciones). - Ejecutando
fasta_stats
enpz_cdnas.fasta
, ¿cuántas unidades diferentes de repetición perfecta (columna seis) se encuentran? - El archivo
pz_blastx_yeast_top10.txt
es el resultado de ejecutarblastx -query.. /fasta_stats/pz_cdnas.fasta -db orf_trans -evalue 1e-6 -max_target_seqs 10 -max_hsps 1 -outfmt 7 -out pz_blastx_yeast_top1.txt
. Aparte de las líneas de “comentario” que comienzan con#
, la primera columna es la ID de consulta, la segunda la ID de destino (levadura), la tercera la identidad porcentual del HSP, la undécima el valor E y la duodécima la “puntuación de bits”. ¿Qué ID de consulta tuvo el bitscore más grande? ¿Cuántas secuencias de consulta diferentes (entradas en la primera columna) tenían uno o más HSP contra la base de datos? - Extraiga de
pz_blastx_yeast_top10.txt
un archivo llamadopz_blastx_yeast_top1.txt
que contenga solo la línea HSP de valor E más pequeña por ID de consulta. (Puede eliminar las líneas de comentarios que comiencen por#
por completo.)
- Una palabra de precaución: si una columna contiene una entrada que no puede interpretarse como un número entero o general, se tratará como
0
en el orden de clasificación.