使用数学表达式修改文本文件

Modify text file with math expression

提问人:user19619903 提问时间:12/8/2022 最后编辑:brian d foyuser19619903 更新时间:12/9/2022 访问量:70

问:

我有一个名为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

我知道这是一个很长的问题,我感谢任何可能使我朝着正确方向转变的帮助。我还是初学者!

与语言无关

评论

0赞 dawg 12/8/2022
矩阵中的原始值是否毫无意义?
0赞 user19619903 12/8/2022
他们是。结构是文件的所有重要因素。因此,这些数字仅在程序每列理解多少个数字方面才重要。
1赞 markp-fuso 12/8/2022
请使用您的尝试和所述代码生成的(错误)输出来更新问题perl/awk/sed
1赞 zdim 12/8/2022
那么,您是否想要一个输出文件,如每个值所示?是否有某些特殊原因需要一个单独的 shell 脚本另一个脚本/单行脚本来处理每个脚本?这一切都可以在一个程序中很好地完成。dd

答:

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