获取线条下方或上方的数据

获取线条下方或上方的数据

这是我的文件:

print energy 1 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol

print energy 2 end
  Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
  Global net ELEC energy = 1.682997967326E+05 kJ/mol

我需要这些数字,但我知道哪一个数字适合我的唯一方法就是线路print。到目前为止,我已经使用这个命令来解决这个问题:

tail -16 file.txt | head -1 | awk '{print $6}'

但我认为这种方式并不好。您必须依赖行号。如果数据在千行中间,你就迷路了。您知道对此有更好的选择吗?

答案1

假设您想在每个包含(猜测)的字段之后打印第二行的print6 个字段,您可以使用:

awk '/print/{if (getline > 0 && getline > 0) print $6}'

或者:

awk '!--n {print $6}; /print/ {n=2}'

如果您希望第一行中的 but-last 字段包含Global在第一次出现 后出现的字段print energy 1 end,则为:

awk '/print energy 1 end/{found=1}; found && /Global/ {print $(NF-1); exit}'

要打印比赛上方行的数据,您需要先记录数据,然后在比赛时打印记录的数据。例如,打印包含以下内容的第一个字段之前的行中的第 6 个字段print

awk '/print/{print recorded;exit};{recorded=$6}'

答案2

根据您的示例数据,这是一个GNU grep解决方案:

$ grep -oP '(?<== ).+? ' file
1.635393034217E+05 
1.635393034217E+05 
1.682997967326E+05 
1.682997967326E+05

答案3

您也可以使用剪切:

cut -d "=" -f2 file

如果您不需要“kJ/mol”,则使用 awk 进行管道传输:

cut -d "=" -f2 file | awk '{print $1}'

答案4

我假设所有打印语句都由空行分隔,并且我还假设您想要在每个包含 print 的语句之后打印第二行的第 6 个字段。

$ cat ccc
print energy 1 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol

print energy 2 end
  Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
  Global net ELEC energy = 1.682997967326E+05 kJ/mol

Read energy 3 end
  Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
  Global net ELEC energy = 1.635393034217E+05 kJ/mol


$ awk -v RS='\n\n' '/print/{gsub (/\n/,""); {print $18}}' ccc
1.635393034217E+05
1.682997967326E+05

相关内容