다른 파일에서 실행하기 위한 cdo 명령용 bash 스크립트

다른 파일에서 실행하기 위한 cdo 명령용 bash 스크립트

저는 UNIX를 처음 접했고 그리드를 투영에서 지리적 좌표계로 변환하기 위해 CDO(Climate Data Operator) "remapbil" 명령을 적용하고 싶습니다. 다음 명령을 사용하면 단일 파일 1개에 대해 완벽하게 작동합니다.

cdo remapbil,target.grd hurs_EUR-11_ICHEC-EC-EARTH_rcp26_r3i1p1_DMI-HIRHAM5_v1_day_20360101-20401231.nc hurs_36_40_bil.nc

하지만 다양한 파일에 대해 이 작업을 수행해야 합니다. 이러한 이유로 나는 내 디렉토리에 있는 모든 파일에 대해 remapbil 명령을 실행할 수 있는 다음 bash 쉘을 작성하려고 했습니다.

#!/bin/bash

for i in *.nc;
do
echo $i
for file in "ls *.nc"; do
cdo remapbil,target.grd tas_EUR-11_ICHEC-EC-EARTH_rcp45_r3i1p1_DMI-HIRHAM5_v1_day_20210101-20251231.nc > tas_$i_bil.nc
done
done

하지만 나는 항상 다음과 같은 오류가 발생합니다.

cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.

누군가 나를 도와줄 수 있을까요? 그러면 좋을 것 같습니다.

답변1

다음과 같이 확인할 수 있듯이 리터럴 인수를 사용하여 명령 for file in "ls *.nc"; do . . . ; done을 한 번 실행합니다 .ls *.nc

$ ls *.nc
bar.nc  foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc

당신은 아마도명령 대체큰따옴표 대신 백틱 사용하지만 그건 나쁜 생각이겠지1 이며 이미 (인용된 경우 안전한) 쉘 글로브를 사용하여 파일을 반복하고 있으므로 필요하지 않습니다. 그래서:

for i in *.nc;
do
echo $i
cdo remapbil,target.grd  "$i" > "tas_${i}_bil.nc"
done

출력 파일에서 확장자를 제거하고 바꾸려면 "tas_${i}_bil.nc"다음으로 변경할 수 있습니다."tas_${i%.nc}_bil.nc"


  1. ~ 아니다파싱 ls?

관련 정보