计算化学公社

标题: [脚本] 批量自动提取cp2k能量计算结果中的Total Energy [打印本页]

作者
Author:
stishovite    时间: 2024-5-14 20:28
标题: [脚本] 批量自动提取cp2k能量计算结果中的Total Energy
本帖最后由 stishovite 于 2024-5-20 08:07 编辑


手动提取能量计算结果是个大工程,于是编了下面这个自动提取最终能量值的脚本(见附件):

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "output_file=TotalEnergy.csv"
  4. echo File Name,Total Energy > "%output_file%"

  5. for %%F in (*.out) do (
  6.     set "final_energy="
  7.     for /f "usebackq delims=" %%L in ("%%F") do (
  8.         set "line=%%L"
  9.         if not "!line:Total energy=!"=="!line!" set "final_energy=!line!"
  10.     )
  11.     if defined final_energy (
  12.         for /f "tokens=3" %%E in ("!final_energy!") do (
  13.             echo %%F,%%E >> "%output_file%"
  14.         )
  15.     )
  16. )

  17. echo Done! Total Energy data saved to "%output_file%".
复制代码


将TotalEnergy.bat放在cp2k能量计算结果的文件夹中,双击运行,即可自动提取*.out文件中Total Energy的最终值,并在当前目录下生成TotalEnergy.csv文件,可直接用Excel打开,很方便。

下图是打开TotalEnergy.csv后的样子。

(, 下载次数 Times of downloads: 24)

(, 下载次数 Times of downloads: 34)

如果大家还有好的意见建议,请留言。



作者
Author:
112233112233    时间: 2026-1-26 16:57
是不是来一个for循环更方便
for i in {01..20}; do echo -n "image_${i}: "; grep "Total FORCE_EVAL" energy_${i}.out | tail -n 1 | awk '{print $NF}'; done

作者
Author:
Uus/pMeC6H4-/キ    时间: 2026-1-26 18:24
112233112233 发表于 2026-1-26 16:57
是不是来一个for循环更方便
for i in {01..20}; do echo -n "image_${i}: "; grep "Total FORCE_EVAL" ene ...

楼主看起来是打算把CP2K计算结果下载到Windows再用bat脚本提取结果的,而你这个是在Linux里面跑的shell命令,其实都用了for循环的逻辑,循环时文件名怎么用变量确定得看具体情形。

另外,awk 里面 $NF 代表的是一行内的总field数而不是某个field的内容。循环每个文件时不需要 grep | tail | awk 这么多重的 pipe ,对于匹配文本不涉及跨行、只需要文件末尾最后一个结果的情况,grep | tail 的逻辑可以用反向 cat 即 tac 代替:
  1. tac energy_${i}.out | awk '/ENERGY| Total FORCE_EVAL ( QS ) energy/ { print $9; exit }'
复制代码

作者
Author:
stishovite    时间: 2026-1-29 15:09
Uus/pMeC6H4-/キ 发表于 2026-1-26 18:24
楼主看起来是打算把CP2K计算结果下载到Windows再用bat脚本提取结果的,而你这个是在Linux里面跑的shell命 ...

谢谢大神的优化方案




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3