테이블의 값 형식 변경

테이블의 값 형식 변경

여러 값을 바꿔야 하는 테이블이 있습니다. 개별 파일에 적용하면 제대로 작동 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

  1. rcps아직 변수를 정의하지 않았습니다 .
  2. 정의했지만 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"다음을 수행해야 합니다.

  1. YMD=$(date +%Y-%m-%d)다른 변수 및 배열로 정의됨
  2. 그리고 sed스크립트를 다음과 같이 다시 작성하십시오.
      sed -e 's/"datum"/"'"${YMD}"'"/g;
              s/ 12:00:00//g;
              s/-/;/g' "$fname" > "${fname}.csv"

그런데, 여러 장면을 가질 계획이라면 scenarios다른 배열로 정의하고 다른 루프를 추가 해야 합니다.for scenario in "${scenarios[@]}" ; do ..... done

관련 정보