从文本文件中提取特定位置的值

从文本文件中提取特定位置的值

我有一个包含大量信息的文件。它看起来像这样:

===============================================================================


   NSTEP       ENERGY          RMS            GMAX         NAME    NUMBER
     52      -4.8969E+05     5.1393E+00     1.7327E+03     P1         31

 BOND    =    29534.6906  ANGLE   =     2139.5547  DIHED      =     9235.7381
 VDWAALS =    51148.8783  EEL     =  -595288.4773  HBOND      =        0.0000
 1-4 VDW =     2741.3848  1-4 EEL =    26043.4789  RESTRAINT  =       29.3591
 DFTBESCF=   -15274.2075
 EAMBER  =  -489718.9594
 NMR restraints: Bond =    0.000   Angle =     0.000   Torsion =     0.000
===============================================================================

现在,我想从单词正下方的行中的“能量”(或第二)列中提取(并只放在一列中)值(此处显示为 -4.8969E+05)ENERGY

我尝试用 来提取它,grep但是没有成功。

答案1

你似乎在说“我想要包含单词的行之后的行中的第二个字段ENERGY (其中ENERGY是第二个字段)。”如果这就是你想要的,你可以这样做

awk '/ENERGY/ { found_it=1; next;     }
    found_it  { print $2; found_it=0; }'

(将您的文件名放在该命令的末尾 — 紧接着}'— 或将您的数据传输到上述命令中。)

这简直

  • 查找包含字符串的行ENERGY
    • found_it当发生这种情况时,会设置一个标志( ),
    • 并跳过该行。
  • 当它遇到一行,并且found_it标志被设置时,这意味着前一行包含ENERGY,所以
    • 打印该行的第二个单词,然后
    • 清除(清零)标志found_it,所以我们不会产生任何后续行的输出。

如果你的文件ENERGY在第 4、14 和 24 行,那么上述命令将打印第 5、15 和 25 行的第二个字段。如果这不是你想要的,一个更简单的方法是

awk '/ENERGY/ { found_it=1; next; }
    found_it  { print $2;   exit; }'

它与第一个相同,只是在打印了第 5 行的第二个字段后,它就停止查找了。即使ENERGY只在文件中出现一次,这种方法也是更好的选择,因为它不需要读取整个文件,而只需要读取您想要的值。

这些命令将:

  • 查找该字符串,即使ENERGY它是较大单词的一部分,例如CENERGYENERGY-CONSUMING或。ENERGYLEVELHIGH-ENERGY
  • 即使该字符串ENERGY 不是其所在行上的第二个字段,也可以找到它。
  • 打印第二个字段的值,而不是找到的字段ENERGY
  • 不是查找Energyenergy
  • ENERGY如果在最后一行,则会默默失败。

如果存在这些问题,请编辑您的问题以指定您的要求。

相关内容