cdo 指令的 bash 腳本可在不同檔案上執行

cdo 指令的 bash 腳本可在不同檔案上執行

我是 UNIX 新手,我想應用 CDO(氣候資料操作員)「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

但我必須對很多不同的文件執行此操作。出於這個原因,我嘗試編寫以下 bash shell,它允許我對目錄中的所有檔案執行 remapbil 命令:

#!/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並且是不必要的,因為您已經使用(如果引用則安全)shell 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

相關內容