ファイル間の入力を読み取るのに問題がある場合は、誰でも助けることができますか?

ファイル間の入力を読み取るのに問題がある場合は、誰でも助けることができますか?

これを行うには、ここでは入力ファイル、値を変更したいファイル、2つのシェルスクリプトなど4つのファイルを使用しています。最初のファイルmodels_linearanalysis_Cep.datは、次のように構成された入力ファイルです。

1   0.020   0.700   5.4 1500    4000
2   0.020   0.700   5.4 1500    4050
3   0.020   0.700   5.4 1500    4100
4   0.020   0.700   5.4 1500    4150
5   0.020   0.700   5.4 1500    4200

d_number列1〜6は、それぞれカタログ番号()、Z、X、質量、L、およびTeffで構成されています。inlist_rsp_Cepheid次の変数を持つ2番目のファイルの変数割り当てを変更するために、1行に6つの値を使用したいと思います。

   RSP_mass = 4.165d0
   RSP_Teff = 6050
   RSP_L = 1438.8d0
   RSP_X = 0.73d0
   RSP_Z = 0.007d0

      log_directory='LOGS_1'
      photo_directory='photos_1'

LOGS_この場合、電話番号(つまり次の数字photos_)は1です。

最初のシェルスクリプトInlists_Bash.sh(下図)では、ここのファイルの6つの列から値を読み取ろうとしmodels_linearanalysis_Cep.dat、それを2番目のシェルスクリプトに読み込もうとしますinlist_changer.sh

while read -ra fields; do
    for field in "${fields[@]}"; do
        bash inlist_changer.sh <<<"$field"
    done
    ./mk
    ./rn
done < models_linearanalysis_Cep.dat

最後に、2番目のシェルスクリプトでは、inlist_changer.sh入力を使用してinlist_rsp_Cepheid変数が適切な値を持つように行を最終的に変更します。

#!/bin/bash

export OMP_NUM_THREADS=12

#used for testing variables
#export mass=4.165d0
#export teff=6050
#export l=1438.8d0
#export x=0.73d0
#export z=0.007d0
#export d_number=2

#read in inputs from the Inlists_Bash.sh file
read -p d_number z x mass l teff 

#inlist directory
export MESA_INLIST="/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist_rsp_Cepheid"

#change the lines in the MESA_INLIST file
sed -i \
  -e "s/^\([[:blank:]]*RSP_mass\).*/\1 = $mass/i" \
  -e "s/^\([[:blank:]]*RSP_Teff\).*/\1 = $teff/i" \
  -e "s/^\([[:blank:]]*RSP_L\).*/\1 = $l/i" \
  -e "s/^\([[:blank:]]*RSP_X\).*/\1 = $x/i" \
  -e "s/^\([[:blank:]]*RSP_Z\).*/\1 = $z/i" \
  -e "s/^\([[:blank:]]*log_directory\).*/\1 = 'LOGS_$d_number'/i" \
  -e "s/^\([[:blank:]]*photo_directory\).*/\1 = 'photos_$d_number'/i" \
  "$MESA_INLIST"

最初の行はinlist_rsp_Cepheid次のようになると予想されます。

   RSP_mass = 5.4
   RSP_Teff = 4000
   RSP_L = 1500
   RSP_X = 0.700
   RSP_Z = 0.020

      log_directory='LOGS_1'
      photo_directory='photos_1'

しかし、次のメッセージを受け取ったときにこれらのファイル間の入力を読み取る方法に問題があることが明らかになりました。

   RSP_mass = 
   RSP_Teff = 
   RSP_L = 
   RSP_X = 
   RSP_Z = 4000

      log_directory='LOGS_'
      photo_directory='photos_'

誰かが私がここで何を見逃しているか間違っているかを説明できますか?

ベストアンサー1

これを変更しInlists_Bash.sh、配列の6つの値をすべて一度に次に渡しますinlist_changer.sh

#!/bin/bash

while read -ra fields; do
  ./inlist_changer.sh "${fields[@]}"
  ./mk
  ./rn
done < models_linearanalysis_Cep.dat

プロンプト文字列(あなたの場合)を印刷するために.inを使用する代わりにパラメータを使用するようにinlist_changer.sh変更し、各呼び出しで変数を設定するだけです$1$6read
-preadd_numberz

#!/bin/bash

export OMP_NUM_THREADS=12
mesa_inlist=/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist_rsp_Cepheid

sed -i \
  -e "s/^\([[:blank:]]*RSP_mass\).*/\1 = $4/i" \
  -e "s/^\([[:blank:]]*RSP_Teff\).*/\1 = $6/i" \
  -e "s/^\([[:blank:]]*RSP_L\).*/\1 = $5/i" \
  -e "s/^\([[:blank:]]*RSP_X\).*/\1 = $3/i" \
  -e "s/^\([[:blank:]]*RSP_Z\).*/\1 = $2/i" \
  -e "s/^\([[:blank:]]*log_directory\).*/\1 = 'LOGS_$1'/i" \
  -e "s/^\([[:blank:]]*photo_directory\).*/\1 = 'photos_$1'/i" \
  "$mesa_inlist"

注:エクスポートした変数が必要な場所は不明ですOMP_NUM_THREADS


またはすべてをスクリプトに入れます。

#!/bin/bash

export OMP_NUM_THREADS=12
mesa_inlist=/home/nick/mesa-r11701/star/test_suite/rsp_Cepheid_grid/inlist_rsp_Cepheid

while read -ra fields; do
  sed -i \
    -e "s/^\([[:blank:]]*RSP_mass\).*/\1 = ${fields[3]}/i" \
    -e "s/^\([[:blank:]]*RSP_Teff\).*/\1 = ${fields[5]}/i" \
    -e "s/^\([[:blank:]]*RSP_L\).*/\1 = ${fields[4]}/i" \
    -e "s/^\([[:blank:]]*RSP_X\).*/\1 = ${fields[2]}/i" \
    -e "s/^\([[:blank:]]*RSP_Z\).*/\1 = ${fields[1]}/i" \
    -e "s/^\([[:blank:]]*log_directory\).*/\1 = 'LOGS_${fields[0]}'/i" \
    -e "s/^\([[:blank:]]*photo_directory\).*/\1 = 'photos_${fields[0]}'/i" \
    "$mesa_inlist"
  ./mk
  ./rn
done < models_linearanalysis_Cep.dat

おすすめ記事