두 번째 행의 구조 값

두 번째 행의 구조 값

스크립트를 실행한 후 다음 줄을 얻습니다.


 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.

"실행: RMS = 7.457(9~9개 원자)" 행에서 "7.457" 값을 추출해야 합니다. "7.457" 값과 "9~9개 원자" 정보는 라운드마다 다르므로 이를 패턴으로 사용할 수 없습니다. "Executive: RMS"는 변경할 수 없지만 위의 일부 줄을 반복합니다. 분명히 나는 ​​항상 두 번째에서 마지막 행에 값을 넣을 것입니다. 이를 사용하여 값을 추출할 수 있지만 Python이나 쉘 스크립트를 사용하여 값을 추출하는 방법을 모르겠습니다.

누구든지 나를 도와줄 수 있나요? 매우 감사합니다!

그런데 제가 작업 중인 스크립트는 다음과 같습니다(RMSD 값을 검색하는 특정 PyMol 프로그램입니다).

## 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")

답변1

script | sed -n '${x;p};h'

내 생각엔 이 정도는 괜찮을 것 같아. 항상 두 번째부터 마지막 ​​줄까지 인쇄합니다.

이 번호만 원하는 경우 다음을 수행할 수 있습니다.

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

매우 크다H 추가도착하다sed's 예비 공간현재 콘텐츠패턴 공간,그리고 아주 소수h 씌우다그것. 따라서 재정의하면예비 공간각 줄에 대해 $마지막 줄 에 x변경예비 공간그리고패턴 공간,그런 다음 두 번째에서 마지막 행을 다루고 있습니다.

이는 필요한 리소스를 가능한 한 적게 사용하기 때문에 이 문제에 대해 제가 상상할 수 있는 최선의 솔루션입니다. 메모리에는 항상 2개 이상의 행이 없습니다.

답변2

출력을 표시하는 방법을 완전히 모르겠습니다. 나는 그것이 당신이 언급한 스크립트에 의해 생성되었다고 가정하고 있으며, 간단히 다른 것을 통해 파이프하여 구문 분석할 수 있습니다. 그렇다면 다음 솔루션이 작동합니다.

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

tail -n 2마지막 두 줄을 인쇄하고 찾고 있는 값이 awk포함된 줄의 네 번째 필드를 인쇄 합니다.RMS

또는:

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

grep이것은 숫자 세트나 첫 번째 숫자를 인쇄하는 .데 사용 됩니다 .head

포함하려는 마지막 줄을 알고 있으므로 RMS간단히 다음을 수행할 수도 있습니다.

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

이는 각 행을 반복하고 포함하는 행을 찾을 때마다 : RMS네 번째 필드를 로 저장합니다 val. 이 END{}블록은 모든 행이 처리된 후에 실행되므로 이 시점에서 val발견된 마지막 값이 됩니다. 가치를 원합니다.

관련 정보