저는 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"