这是我的文件:
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
假设您想在每个包含(猜测)的字段之后打印第二行的第print
6 个字段,您可以使用:
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