파일 간 입력을 읽는 데 문제가 있으면 누구든지 도와줄 수 있나요?

파일 간 입력을 읽는 데 문제가 있으면 누구든지 도와줄 수 있나요?

이 작업을 수행하기 위해 여기서는 입력 파일, 값을 변경하려는 파일, 그리고 두 개의 쉘 스크립트 등 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_number1~6열은 각각 카탈로그 번호( ), Z, X, 질량, L 및 Teff 로 구성됩니다 . inlist_rsp_Cepheid다음 변수가 있는 두 번째 파일의 변수 할당을 변경하기 위해 한 줄에 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, 이를 두 번째 쉘 스크립트로 읽어들이려고 합니다 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

마지막으로 두 번째 쉘 스크립트에서는 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

관련 정보