Estoy tratando de extraer la ID de secuencia y el número de clúster que ocurren en diferentes líneas dentro del mismo archivo de texto.
La entrada se parece a
>Cluster 72
0 319aa, >O311_01007... *
>Cluster 73
0 318aa, >1494_00753... *
1 318aa, >1621_00002... at 99.69%
2 318aa, >1622_00575... at 99.37%
3 318aa, >1633_00422... at 99.37%
4 318aa, >O136_00307... at 99.69%
>Cluster 74
0 318aa, >O139_01028... *
1 318aa, >O142_00961... at 99.69%
>Cluster 75
0 318aa, >O300_00856... *
La salida deseada es la ID de secuencia en una columna y el número de clúster correspondiente en la segunda.
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
¿Alguien puede ayudarme con esto?
>
? Además, puede estar interesado en nuestro sitio hermano, Bioinformática .Respuestas:
Con awk:
-F '[. ]*'
>Cluster
líneas), guarde el segundo campo como ID y pase a la siguiente líneafuente
$1 == ">Cluster"
lugar deNF == 2
, dependiendo de qué otra cosa podría haber en el archivo.Puedes usar
awk
para esto:La primera instrucción de bloque captura la ID del clúster. La segunda instrucción de bloque (la predeterminada) extrae los datos deseados e imprime.
fuente
" "
como argumento paraprint
. Simplemente use una coma para separar los argumentos y usará el OFS, espacio predeterminado, para separar los argumentos.Aquí hay una alternativa con Ruby como una frase:
o se extendió en varias líneas:
Supongo que solo es más legible que la
awk
versión si conoces Ruby y regexen. Como beneficio adicional, este código podría ser un poco más robusto que simplemente dividir las líneas, ya que busca el texto circundante.fuente
Perl:
Explicación
perl -ne
: lea el archivo de entrada línea por línea (-n
) y aplique la secuencia de comandos dada por-e
a cada línea.if(/^>.*?(\d+)/){$n=$1;}
: si esta línea comienza con a>
, encuentre el tramo más largo de números al final de la línea y guárdelo como$n
.else{ s/.*(>[^.]+).*/$1 $n/; print
: si la línea no comienza>
, reemplace todo con el tramo más largo de.
caracteres que no siguen a>
(>[^.]+
), es decir, el nombre de la secuencia ($1
porque hemos capturado la coincidencia de expresiones regulares) y el valor actual de$n
.O, para un enfoque más awk-like:
Esta es solo una forma un poco más engorrosa de hacer la misma idea básica que los diversos
awk
enfoques. Lo incluyo para completarlo y para los fanáticos de Perl. Si necesita una explicación, simplemente use las soluciones awk :).fuente