有人可以帮助我解决读取文件之间输入的问题吗?

有人可以帮助我解决读取文件之间输入的问题吗?

我在这里使用四个文件来完成此任务:一个输入文件、我要更改其值的文件以及两个 shell 脚本。第一个文件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

1-6 列分别组织为目录号 ( d_number)、Z、X、质量、L 和 Teff。我想使用每行的 6 个值来更改第二个文件中变量的分配,inlist_rsp_Cepheid该文件具有以下变量:

   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。

在我的第一个 shell 脚本Inlists_Bash.sh(如下所示)中,我尝试从此处文件的六列中读取值models_linearanalysis_Cep.dat,我打算将其读入第二个 shell 脚本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

最后,在第二个 shell 脚本中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为此并将数组的所有六个值一次传递到inlist_changer.sh

#!/bin/bash

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

更改inlist_changer.sh为使用参数$1...$6而不是使用read.
in用于打印提示字符串(在您的情况下) -p,并且您仅在每个调用中设置变量。readd_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

相关内容