다른 파일에서 실행되는 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 이며 파일을 반복하기 위해 이미 (인용된 경우 안전한) 쉘 glob을 사용하고 있으므로 필요하지 않습니다. 그래서:

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?

관련 정보