我有一个包含大量信息的文件。它看起来像这样:
===============================================================================
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
它是较大单词的一部分,例如CENERGY
、ENERGY-CONSUMING
或。ENERGYLEVEL
HIGH-ENERGY
- 即使该字符串
ENERGY
不是其所在行上的第二个字段,也可以找到它。 - 打印第二个字段的值,而不是找到的字段
ENERGY
。 - 不是查找
Energy
或energy
。 ENERGY
如果在最后一行,则会默默失败。
如果存在这些问题,请编辑您的问题以指定您的要求。