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

相关内容