Resgatar valor da segunda última linha

3

Depois de executar um script, tenho as seguintes linhas:

 PyMOL(TM) Molecular Graphics System, Version 1.4.1.
 Copyright (c) Schrodinger, LLC.
 All Rights Reserved.

    Created by Warren L. DeLano, Ph.D. 

    PyMOL is user-supported open-source software.  Although some versions
    are freely available, PyMOL is not in the public domain.

    If PyMOL is helpful in your work or study, then please volunteer 
    support for our ongoing efforts to create open and affordable scientific
    software by purchasing a PyMOL Maintenance and/or Support subscription.

    More information can be found at "http://www.pymol.org".

    Enter "help" for a list of commands.
    Enter "help <command-name>" for information on a specific command.

 Hit ESC anytime to toggle between text and graphics.

 Command mode. No graphics front end.
 Detected 8 CPU cores.  Enabled multithreaded rendering.
PyMOL>align MHC1, MHC2
 Match: read scoring matrix.
 Match: assigning 385 x 384 pairwise scores.
 MatchAlign: aligning residues (385 vs 384)...
 ExecutiveAlign: 3810 atoms aligned.
 Executive: RMS =    0.000 (3810 to 3810 atoms)
PyMOL>sele EP1, chain M
 Selector: selection "EP1" defined with 63 atoms.
PyMOL>sele EP2, chain R
 Selector: selection "EP2" defined with 64 atoms.
PyMOL>rms_cur EP1 and n. CA, EP2 and n. CA
 Executive: RMS =    7.457 (9 to 9 atoms)
 PyMOL: normal program termination.

Eu preciso extrair o valor "7,457" da linha "Executivo: RMS = 7,457 (9 a 9 átomos)". Deve-se notar que o valor "7.457", assim como a informação "9 a 9 átomos" irá variar entre diferentes rodadas, então eu não posso usá-lo como um padrão. O "Executive: RMS" não é variável, mas é repetido algumas linhas acima. Aparentemente, vou ter o valor sempre na segunda última linha. Isso pode ser usado para extrair o valor, mas não sei como fazê-lo com python ou shell script.

Alguém pode me ajudar? Muito obrigado!

A propósito, este é o script em que estou trabalhando (é um programa PyMol específico, recuperando valores de RMSD):

## RUNNING
## Importing PyMol files
from pymol.cgo import *
from pymol import cmd
from pymol import stored
# Loading MHC1
cmd.load ("MHC1.pdb")
#Change chain C to chain M (MHC1 epitope)
cmd.alter (('chain C'),'chain="M"')
# Loading MHC2
cmd.load ("MHC2.pdb")
#Change chain C to chain R (MHC2 epitope)
cmd.alter (('chain C'),'chain="R"')
## Align MHC1 and MHC2
cmd.do ("align MHC1, MHC2")
## MHC1 epitope selection (EP1)
cmd.do ("sele EP1, chain M")
## MHC2 epitope selection (EP2)
cmd.do ("sele EP2, chain R")
## Remove chain names (this is required so 'rms_cur' will work properly)
cmd.alter (("all"),'chain=""')
## Residues numbers aligned (this is required so 'rms_cur' will work properly)
cmd.alter (("all"),'segi=""')
## RMSD Calculation between EP1 and EP2
cmd.do ("rms_cur EP1 and n. CA, EP2 and n. CA")
    
por Maurici 15.04.2014 / 15:57

2 respostas

2

Não estou totalmente claro sobre como você obtém a saída exibida. Eu estou supondo que é produzido pelo script que você mencionou e que você pode simplesmente canalizá-lo através de outra coisa para analisá-lo. Em caso afirmativo, essas soluções devem funcionar:

your_script | tail -n 2 | awk '/RMS/{print $4}'

tail -n 2 imprime as duas últimas linhas e awk imprime o quarto campo de qualquer linha contendo RMS , ou seja, o valor que você está procurando.

Alternativamente:

your_script | tail -n 2 | grep -oP '[.\d]+' | head -1

Isso representará grep para conjuntos de números ou . e usará head para imprimir o primeiro.

Como você sabe que deseja a última linha que contém RMS , também pode simplesmente fazer:

your_script | awk '/: RMS/{val=$4}END{print val}' 

Isso passará por cada linha e toda vez que encontrar uma que contenha : RMS , ela salvará o quarto campo como val . O bloco END{} é executado depois que todas as linhas tiverem sido processadas. Nesse ponto, val será o último valor encontrado, aquele que você deseja.

    
por 15.04.2014 / 16:07
3
script | sed -n '${x;p};h'

Isso deve acontecer, eu acho. Ele sempre imprime a segunda à última linha.

Se você quiser apenas o número que você:

script | sed -n '${x;s/.*= *//;s/ .*//p};h'

Tão grande H acrescenta a sed's manter espaço no conteúdo do espaço padrão , considerando que pouco h < em> substitui isso. Então, se você sobrescrever o espaço de espera para cada linha, e na última linha $ você e x mudará o espaço de espera com o espaço padrão , então você está trabalhando com o segundo para a última linha.

Esta é a melhor solução possível para esse problema que eu posso imaginar porque ele usa a menor quantidade de recursos que podem ser necessários. Você nunca tem mais do que duas linhas na memória a qualquer momento.

    
por 15.04.2014 / 16:06

Tags