我有一个带有数值的文件需要多次编辑并保存为单独的文件。
e.g。
然后需要将文件保存为编辑值的函数,例如 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
给我以下错误
最好的情况是,如果这个脚本可以在theta和r上做2次循环。我使用using sed to edit a url string in script作为主要参考。
最终结果 - 允许我懒惰地并行化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
答案 0 :(得分: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 ;
替换为r
和theta
的值,使用下一个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)
依旧......