倒数第二行的救援值

倒数第二行的救援值

运行脚本后,我得到以下几行:


 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 或 shell 脚本来提取值。

有人能帮我吗?非常感谢!

顺便说一句,这是我正在处理的脚本(它是特定的 PyMol 程序,检索 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")

答案1

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

我想,这样就应该可以了。它总是打印倒数第二行。

如果您只想要这个号码,您可以:

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

很大H 追加sed's 保留空间当前的内容图案空间,而很少h 覆盖它。所以如果你覆盖保留空间对于每一行,并在$最后一行x更改保留空间图案空间,那么你正在处理倒数第二行。

这是我能想象到的这个问题的最佳解决方案,因为它使用了尽可能少的必要资源。任何时候,内存中的行数永远不会超过两行。

答案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将是找到的最后一个值,即您想要的值。

相关内容