如何批量修改POSCAR文件中的3×3矩阵(含d值循环)
批量修改POSCAR文件3×3矩阵的脚本完善方案
我有一个名为POSCAR的文件,内容如下:
Pt-FCC 3.975 3.975000 0.000000 0.000000 0.000000 3.975000 0.000000 0.000000 0.000000 3.975000
需要多次修改其中的3×3矩阵,d取值范围为0.005到0.025,步长0.005,修改后的矩阵格式要求:
Pt-FCC 3.975 1+d 0.000000 0.000000 0.000000 1-d 0.000000 0.000000 0.000000 1/(1-d^2)
例如d=0.005时的效果:
Pt-FCC 3.975 1.005000 0.000000 0.000000 0.000000 0.995000 0.000000 0.000000 0.000000 1.000025
由于仿真程序不识别文件内变量及计算表达式,我尝试用循环遍历d值,复制原文件后用perl、sed或awk修改矩阵并保持格式,现有部分脚本如下,寻求完善方法(我是新手):
for i in $(seq 0.005 0.005 0.025) do cp POSCAR POSCAR_pure_shear/POSCAR_pure_$i perl -pi .................. POSCAR_pure_$i done
完善方案(推荐用awk实现)
直接在循环中用awk完成计算和行替换,无需先复制再修改,步骤更简洁高效:
# 先确保目标目录存在,避免报错 mkdir -p POSCAR_pure_shear for d in $(seq 0.005 0.005 0.025) do # 计算三个矩阵元素,保留6位小数匹配原文件格式 val1=$(printf "%.6f" $(echo "1 + $d" | bc -l)) val2=$(printf "%.6f" $(echo "1 - $d" | bc -l)) val3=$(printf "%.6f" $(echo "1 / (1 - $d * $d)" | bc -l)) # 用awk读取原文件,替换第3-5行的矩阵内容,输出到目标文件 awk -v v1="$val1" -v v2="$val2" -v v3="$val3" ' NR == 3 {print v1 " 0.000000 0.000000"} NR == 4 {print "0.000000 " v2 " 0.000000"} NR == 5 {print "0.000000 0.000000 " v3} NR != 3 && NR !=4 && NR !=5 {print $0} ' POSCAR > POSCAR_pure_shear/POSCAR_pure_$d done
脚本说明
mkdir -p POSCAR_pure_shear:自动创建目标目录,即使目录已存在也不会报错。bc -l用于高精度浮点计算,printf "%.6f"确保结果保留6位小数,和原文件格式完全一致。- awk通过
-v参数传入计算好的数值,根据行号(NR)精准替换第3、4、5行,其他行原样输出。
Perl实现版本
如果坚持使用Perl,可修改脚本如下:
mkdir -p POSCAR_pure_shear for d in $(seq 0.005 0.005 0.025) do val1=$(printf "%.6f" $(echo "1 + $d" | bc -l)) val2=$(printf "%.6f" $(echo "1 - $d" | bc -l)) val3=$(printf "%.6f" $(echo "1 / (1 - $d * $d)" | bc -l)) perl -pi -e ' BEGIN { $v1 = shift; $v2 = shift; $v3 = shift; $line_count = 0; } $line_count++; if ($line_count == 3) { print "$v1 0.000000 0.000000\n"; next; } if ($line_count == 4) { print "0.000000 $v2 0.000000\n"; next; } if ($line_count == 5) { print "0.000000 0.000000 $v3\n"; next; } print; ' "$val1" "$val2" "$val3" POSCAR_pure_shear/POSCAR_pure_$d done
注意事项
- 确保系统安装了
bc工具(多数Linux发行版默认自带),用于处理浮点计算。 - 生成的文件名会保留d的小数形式(如
POSCAR_pure_0.005),方便对应参数识别。
内容的提问来源于stack exchange,提问作者user19619903
相关产品推荐
相关产品推荐

