【问题标题】:Modify text file with math expression用数学表达式修改文本文件
【发布时间】:2022-12-11 16:40:16
【问题描述】:

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

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

【问题讨论】:

  • 矩阵中的原始值是否毫无意义?
  • 他们是。结构是文件的全部内容。因此,数字仅在程序理解每列多少数字方面才重要。
  • 请使用您的 perl/awk/sed attemp(s) 和上述代码生成的(错误)输出更新问题
  • 那么您是否想要一个输出文件,如d 的每个值所示...?是否有一些特殊原因需要单独的 shell 脚本另一个脚本/单行程序来处理每个d?这一切都可以在一个程序中很好地完成。

标签: language-agnostic


【解决方案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

【讨论】:

  • 谢谢!效果很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多