提问人:user19619903 提问时间:12/8/2022 最后编辑:brian d foyuser19619903 更新时间:12/9/2022 访问量:70
使用数学表达式修改文本文件
Modify text file with math expression
问:
我有一个名为POSCAR的文件,看起来像这样。
Pt-FCC
3.975
3.975000 0.000000 0.000000
0.000000 3.975000 0.000000
0.000000 0.000000 3.975000
我需要多次更改 3x3x3 矩阵,以获得以下形状和值,其中 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
我无法在文件中分配一个变量并使用 expr 和 echo 来计算它,因为模拟程序不理解这一点。我正在尝试使用一个循环,该循环遍历 d 的所有值并复制原始 POSCAR 文件,然后使用 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
我知道这是一个很长的问题,我感谢任何可能使我朝着正确方向转变的帮助。我还是初学者!
答:
3赞
dawg
12/8/2022
#1
你可以做这样的事情:
awk -v d=0.005 'FNR==3 {$1=sprintf("%0.6f", 1+d)}
FNR==4 {$2=sprintf("%0.6f",1-d)}
FNR==5 {$3=sprintf("%0.6f",1/(1-d**2))}
1' file
指纹:
Pt-FCC
3.975
1.005000 0.000000 0.000000
0.000000 0.995000 0.000000
0.000000 0.000000 1.000025
将其插入到您的循环中:
for i in $(seq 0.005 0.005 0.025)
do
awk -v d="$i" 'FNR==3 {$1=sprintf("%0.6f", 1+d)}
FNR==4 {$2=sprintf("%0.6f",1-d)}
FNR==5 {$3=sprintf("%0.6f",1/(1-d**2))}
1' file
done
下一个:使用空队列反转队列
评论
perl/awk/sed
d
d