ATAT 文本提取与批量处理实操
用32个实际终端条件讲解8个文本工具,包含真实QE输出提取、六种取行方式、换行备份和目录筛选。
阅读本篇目录
批量计算经常需要从输出里提取能量、整理数字列、读取指定区段,再按目录收集结果。ATAT带有8个轻量文本工具;本篇按“准备输入→执行命令→检查输出”实际操作,不需要先运行团簇展开或VASP。
1. 获取实例#
unzip atat-text-tools-wave150-*.zip -d atat-text-tools
cd atat-text-tools
bash run.sh list
模块为 atat/3.52-8173m:ATAT3.52主程序使用GNU G++13.3编译,本篇8个入口本身是csh/bash脚本,调用系统awk、sed和find。分析/绘图使用 ase/3.29.0 中的Python3.11.16、NumPy2.3.5和Matplotlib3.11.2。仅需已分配资源内1个CPU,不需要GPU。
选择一个工具,直接输入名称或编号:
bash run.sh getlines
# 同样可以:bash run.sh 3
ls work-getlines
完整跑32个条件,在新的解压目录执行:
bash run-all.sh
head -5 analysis/text-tool-outputs.csv
ls figures
它只处理实例包内的输入及新建的教学目录。另一份新解压目录用 bash analyze.sh 读取配套真实结果,输出到 analysis-reference/、figures-reference/。目录保护会拒绝覆盖已经生成的结果。
下面的原生命令需要先在当前终端加载ATAT:
module load atat/3.52-8173m
2. calc:表达式和常用数学函数#
calc "2+3*4"
calc "(2+3)*4"
calc "2^5"
calc "sqrt(2)"
calc "log(exp(1.25))"
calc "atan2(0,-1)"
calc "1.5e-3*2000"
对应输出为:
14
20
32
1.41421
1.25
3.14159
3
表达式使用awk语法,幂写 ^。引号可避免括号、星号被shell提前处理。默认打印约6位有效数字,适合快速估算;高精度能量差或最终数值处理改用Python等明确指定精度的工具。
3. getvalue:标签、符号和科学计数法#
cat inputs/values.txt
getvalue E < inputs/values.txt
教学输入同时使用等号、冒号、空白和制表符,实际输出为:
-1.25
+2.5e-03
3.75D+01
-4.2
-0.5
0.6
同一行出现两次标签,也会得到两个结果。D指数按原文本保留;交给Python时先把 D/d 换成 E/e。标签按脚本中的正则表达式匹配,普通字母标签最直接;包含特殊正则字符时需要额外处理。
包内还包含此前实际计算的Si16固定结构位移QE/PBE单点输出,本篇没有重跑QE。提取总能:
getvalue '! total energy' < inputs/Si16-QE-forces.out
-125.99973362
原输出此行的单位是Ry,工具只提数字,不自动转成eV,也不判断是否电子收敛。先查看原输出、确认标签和单位,再用于能量比较。
找不到标签时,本版本输出为空并返回1;在 set -e 的脚本中应明确处理这个分支:
if getvalue MISSING < inputs/Si16-QE-forces.out > selected.txt; then
cat selected.txt
else
echo "未提取到该标签,请检查标签和原始输出"
fi
不要仅把空文件当成零能量。
4. getlines:六种区段选择#
cat inputs/markers.txt
完整输入为:
header
BEGIN
alpha 1
beta 2
END
footer
BEGIN
gamma 3
END
trailer
实际操作:
getlines -af BEGIN END < inputs/markers.txt
getlines -bf BEGIN END < inputs/markers.txt
getlines -bt BEGIN END < inputs/markers.txt
getlines -jaf BEGIN END < inputs/markers.txt
getlines -jbf BEGIN END < inputs/markers.txt
getlines -jbt BEGIN END < inputs/markers.txt
| 选项 | 本例结果 |
|---|---|
-af |
从第一个BEGIN开始到文件末尾,包含该BEGIN |
-bf |
header和第一个BEGIN |
-bt |
两个BEGIN…END区段,保留边界行 |
-jaf |
第一个BEGIN之后到末尾;后续BEGIN仍保留 |
-jbf |
仅header |
-jbt |
alpha 1、beta 2、gamma 3,不含BEGIN/END |
例如只要两个区段的数据行:
getlines -jbt BEGIN END < inputs/markers.txt > selected-blocks.txt
cat selected-blocks.txt
alpha 1
beta 2
gamma 3
标记也按正则匹配;避免把会在正常数据行出现的宽泛字符串选作边界。
5. blanktonl与nltoblank:短数字列表#
blanktonl < inputs/numbers.txt > column.txt
cat column.txt
nltoblank < column.txt
前者把空格/制表符分隔的 1 2 3 变成三行;后者得到 1 2 3 ,末尾带空格而没有换行。需要在屏幕显示后换行时,再执行 printf '\n'。
它们适合简单数字列表,不保留原表格列布局。当前 nltoblank 将整行交给awk的printf格式,含 % 等内容的任意字符串应使用其他方式,例如:
paste -sd' ' column.txt
这不是CSV解析器,不能直接处理含引号和分隔符的复杂表格。
6. fixeol:先看换行,再选流式或文件模式#
Windows文本通常为CRLF,Unix文本为LF。先把输出写进新文件,不直接改原件:
fixeol -u < inputs/windows.txt > unix-copy.txt
fixeol -p < inputs/unix.txt > windows-copy.txt
od -An -t x1 unix-copy.txt
od -An -t x1 windows-copy.txt
LF对应 0a,CRLF对应 0d 0a。实际字节对照如下:

文件模式会修改给出的文件并创建 .bak;本例先复制两份教学文件:
mkdir newline-demo
cp inputs/windows.txt newline-demo/one.txt
cp inputs/windows.txt newline-demo/two.txt
fixeol -u newline-demo/one.txt newline-demo/two.txt
cmp inputs/windows.txt newline-demo/one.txt.bak
cmp inputs/unix.txt newline-demo/one.txt
两次cmp没有输出且返回0,表示备份保留了原CRLF字节,转换文件变成LF。.bak 名称固定,后续再次转换可能覆盖原备份;不要对已经是CRLF的文件反复执行 -p。该脚本按简单文件名处理参数,示例目录和文件名不要包含空格。
7. lookup:只看有限层父目录#
mkdir -p lookup-demo/a/b
printf 'own example\n' > lookup-demo/target.wrap
cd lookup-demo/a/b
lookup target.wrap
cd ../../..
输出 ../../target.wrap。实际分层例子确认它最多检查当前目录和上方5层父目录,共6个位置;目标在第6层父目录时不会找到。它输出相对路径,不递归扫描子目录,也不读取文件内容。
8. foreachfile:先筛选目录,再执行收集#
完整重跑会生成 work/batch-inputs;四个一级子目录和一个二级子目录分别包含教学数字:
| 目录 | energy | 其他文件 |
|---|---|---|
| a | -1 | ready |
| b | -2 | ready、error |
| c | -3 | skip |
| d | -4 | 无 |
| a/nested | -5 | 二级目录 |
| 根目录 | -99 | 不作为子目录处理 |
这些数字是目录筛选用的教学输入,不是材料能量。操作前可先用 pwd 确认范围,再只读收集:
cd work/batch-inputs
foreachfile energy pwd
foreachfile energy cat energy
foreachfile -e energy cat energy
foreachfile -n skip energy cat energy
foreachfile -a ready energy cat energy
foreachfile -e -n skip -a ready energy cat energy
foreachfile -d 2 energy cat energy
cd ../..
| 方式 | 实际选中 |
|---|---|
| 默认 | a、b、c、d,共4个 |
-e |
跳过带error的b,共3个 |
-n skip |
跳过c,共3个 |
-a ready |
只保留a和b,共2个 |
组合 -e -n skip -a ready |
只保留a |
-d 2 |
加上a/nested,共5个 |

脚本会实际执行后面的命令,本例只用 pwd 和 cat energy。目录名使用简单字符、避免空格;先检查筛选范围,再替换成你自己的处理命令。它不保证输出顺序,整理结果时按结构编号或明确的目录标识对应,不用碰巧出现的行顺序拼接不同性质。
9. 完成后保留哪些结果#
head -10 analysis/text-tool-outputs.csv
ls work/getlines-jbt
cat work/getvalue-qe/stdout.txt
ls figures
每个条件保留命令、退出状态、标准输出和错误输出;主要结果分别是实际提取数字、选中的区段、转换前后字节与目录筛选集合。原始输入保留在 inputs/。
本篇覆盖8个文本入口和它们这里列明的主要脚本选项,其他ATAT计算功能继续看专题导读及完整命令参考。不能用文本工具执行成功代替材料计算收敛或数据物理合理性的检查。