2

複数回編集して別のファイルとして保存する必要がある数値を含むファイルがあります。

例えば

  1. シータ = 0.0 度 ---> シータ = 30.0 度
  2. r = 1.0 ---> r = 4.0
  3. 入れて、成形して、visual_1_0 ; ---> put, molden, 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、文字 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 ))ます。

数値を 10 進精度のprintf浮動小数点数としてフォーマットし、最後に 'LC_ALL=C' でロケールをC- に設定するため、printf多くの国際設定のようにコンマではなく小数点を出力します。(C や us などを使用している場合は、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を使用します。thetased

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 に答える