私は 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
リテラル引数を使用してコマンドを 1 回実行します。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"