
여러 값을 바꿔야 하는 테이블이 있습니다. 개별 파일에 적용하면 제대로 작동 sed
하는 다양한 명령이 있습니다 . tr
하지만 이 명령으로 루프를 만들고 싶을 때 전혀 작동하지 않습니다. 이것은 내 루프입니다.
#!/bin/bash
in_dir=/home/stevens/SUMARIO/regional_model/data/basin
stations="almourol alton cuntan eldeim farakka koulikoro lobith louth olivenca stolb tangnaihai"
gcms="gfdl-esm2m hadgem2-es ipsl-cm5a-lr miroc-esm-chem noresm1-m"
scenarios="rcp8p5"
for station in ${stations};do
echo "go to directory"
cd ${in_dir}/${station}
for gcm in ${gcms};do
for rcp in ${rcps};do
cd ${in_dir}/${station}
echo "replace datum"
sed 's/"datum"/"YEAR-MONTH-DAY"/g' ${station}_${gcm}_${scenario} > ${station}_${gcm}_${scenario}.c
echo "delete hour"
sed 's/ 12:00:00//g' ${station}_${gcm}_${scenario}.c > ${station}_${gcm}_${scenario}.cs
echo "replace - to ;"
tr "-" ";" < ${station}_${gcm}_${scenario}.cs > ${station}_${gcm}_${scenario}.csv
rm ${station}_${gcm}_${scenario}.cs ${station}_${gcm}_${scenario}.c
done
done
done
이 루프가 작동하지 않는 이유를 아는 사람이 있습니까?
답변1
rcps
아직 변수를 정의하지 않았습니다 .- 정의했지만
scenarios
사용했습니다.scenario
다음은 이러한 문제를 해결하고 기타 개선 사항을 적용한 스크립트 버전입니다.
- 가독성을 위해 추가 줄 바꿈 및 정렬된 들여쓰기가 포함된 형식
- 공백으로 구분된 문자열 대신 배열을 사용하세요.
sed
여러번 추가하지 말고 한번만 사용하세요tr
- 모든 변수를 큰따옴표로 묶습니다.
- 모든 고정 문자열을 작은따옴표로 묶음
$fname
사용할 때마다 재구성하는 대신 생성된 파일 이름( )을 유지하도록 변수( )를 정의하는${station}_${gcm}_${scenario}
것은 읽기 어렵고 입력 오류가 발생하기 쉽습니다.
#!/bin/bash
in_dir='/home/stevens/SUMARIO/regional_model/data/basin'
stations=(almourol alton cuntan eldeim farakka koulikoro lobith louth
olivenca stolb tangnaihai)
gcms=(gfdl-esm2m hadgem2-es ipsl-cm5a-lr miroc-esm-chem noresm1-m)
scenario='rcp8p5'
rcps=(a b c)
for station in "${stations[@]}" ; do
cd "${in_dir}/${station}"
for gcm in "${gcms[@]}"; do
for rcp in "${rcps[@]}" ; do
fname="${station}_${gcm}_${scenario}"
echo "replace datum: $fname"
sed -e 's/"datum"/"YEAR-MONTH-DAY"/g;
s/ 12:00:00//g;
s/-/;/g' "$fname" > "${fname}.csv"
done
done
done
문자열을 실제 날짜로 바꾸려면 "datum"
다음을 수행해야 합니다.
YMD=$(date +%Y-%m-%d)
다른 변수 및 배열로 정의됨- 그리고
sed
스크립트를 다음과 같이 다시 작성하십시오.
sed -e 's/"datum"/"'"${YMD}"'"/g;
s/ 12:00:00//g;
s/-/;/g' "$fname" > "${fname}.csv"
그런데, 여러 장면을 가질 계획이라면 scenarios
다른 배열로 정의하고 다른 루프를 추가 해야 합니다.for scenario in "${scenarios[@]}" ; do ..... done