2

我有一个数值文件,需要多次编辑并保存为单独的文件。

例如

  1. θ = 0.0 度 ---> θ = 30.0 度
  2. r = 1.0 ---> r= 4.0
  3. 把,模具,visual_1_0;---> 放,模具,visual_r_theta;

然后需要将文件保存为编辑值的函数,例如 n2o_r_theta.inp

对于编辑我已经尝试过

#!/bin/bash

for i in {1..6}
do
 r = 1.0
 theta = i*15.0
 cat n2o.inp |
 sed -i.bk -Ee "s/(theta = )/\1${theta}\2/" \
     -e "s/(r = )/\1${r}\2/" \
     -e "s/(put, molden, )/\1visual_${r}_${theta};\2/" n2o_${r}_${theta}.inp
done

给我以下错误

  1. editor.scr:第 5 行:r:找不到命令
  2. editor.scr:第 6 行:theta:找不到命令
  3. sed: -e 表达式 #1, char 18: 's' 命令的 RHS 上的无效引用 \2

最好的情况是这个脚本是否可以在 theta 和 r 上进行 2 次循环。我使用 sed 编辑脚本中的 url 字符串作为我的主要参考。

最终结果- 允许我延迟并行化 molpro 脚本,因为它具有不稳定的多维实现

LC_ALL=C

for j in {4..4}
do
for i in {1..6}
do
    r=$(echo "scale=1; $j/2.0" | bc -l)
    theta=$(echo "scale=1; $i * 15.0" | bc -l)
    sed "s/theta = 0.0/theta = $theta/;
         s/rnn = 1.0 ang/rnn = $r ang/;
         s/visual/visual_r_${r}_theta_${theta}/" < master.inp >n2o_r_${r}_theta_${theta}.inp
    molpro2010s n2o_${r}_${theta}.inp &
done
done
4

1 回答 1

3

您可以尝试以下操作:

LC_ALL=C
for i in {1..6}
do
    r=$(printf "%.1f" $i)
    theta=$(printf "%.1f" $(($i*15)) )
    sed "s/theta = 0.0/theta = $theta/;s/r = 1.0/r = $r/;s/visual_1_0/visual_r_theta/" < n2o.inp >n2o_${r}_${theta}.inp
done

作业中不应有空格=bash可以使用$(( expression ))语法进行计算(仅限整数) 。

printf数字格式化为具有一位小数精度的浮点数,最后 'LC_ALL=C' 将语言环境设置为C- 因此,printf打印小数点而不是许多国际设置中的逗号。(如果您有 C 或我们之类的,则不需要 LC_ALL 行)。

上面的脚本从输入文件生成:

theta = 0.0 deg
r = 1.0
put, molden, visual_1_0 ;

接下来的 6 个文件

theta = 15.0 deg
r = 1.0
put, molden, visual_r_theta ;

theta = 30.0 deg
r = 2.0
put, molden, visual_r_theta ;

theta = 45.0 deg
r = 3.0
put, molden, visual_r_theta ;

theta = 60.0 deg
r = 4.0
put, molden, visual_r_theta ;

theta = 75.0 deg
r = 5.0
put, molden, visual_r_theta ;

theta = 90.0 deg
r = 6.0
put, molden, visual_r_theta ;

如果你想要

put, molden, visual_r_theta ;

替换为的值rtheta使用下一sed行:

sed "s/theta = 0.0/theta = $theta/;s/r = 1.0/r = $r/;s/visual_1_0/visual_${r}_${theta}/" < n2o.inp >n2o_${r}_${theta}.inp

将产生如下行:

put, molden, visual_4.0_60.0 ;

最后,如果你需要浮点计算,你应该使用如下bc命令:

theta=$(echo "scale=1; $i * 12.5" | bc -l)

等等...

于 2013-06-24T20:58:33.690 回答