こんにちは、次のループを実行して複数の緯度と経度にremapnnコマンドを適用できます。
era_Temperature_2016era_Temperature_2017era_Temperature_2018era_Temperature_2019era_Temperature_2020という名前のNETCDFファイルがたくさんあり、これらすべてのファイルにループを適用したいと思います。
#!/bin/bash
infile="era_temperature_2016.nc"
coords="coords.txt"
while read line
do
line=$(echo $line | sed -e 's/\r//g')
station=$(echo $line | cut -d ' ' -f 1)
#-- skip header line
if [[ "$station" == "station" ]]; then continue; fi
#-- select station coordinates
lat=$(echo $line | cut -d ' ' -f 2)
lon=$(echo $line | cut -d ' ' -f 3)
station="${station}_${lat}_${lon}"
#-- extract the station data
cdo -remapnn,"lon=${lon}_lat=${lat}" ${infile} ${station}_out.nc
done < $coords
以下を試しましたが、エラーが発生します。
間違い ./values1.sh:行5:coords="coords.txt"' ./values1.sh: line 5:
予期しないタグcoords = "coords.txt"'の近くに構文エラーがあります。
#!/bin/bash
my_files=$(ls era_temperature_*.nc)
for f in $my_files
coords="coords.txt"
while read line
do
line=$(echo $line | sed -e 's/\r//g')
station=$(echo $line | cut -d ' ' -f 1)
#-- skip header line
if [[ "$station" == "station" ]]; then continue; fi
#-- select station coordinates
lat=$(echo $line | cut -d ' ' -f 2)
lon=$(echo $line | cut -d ' ' -f 3)
station="${station}_${lat}_${lon}"
#-- extract the station data
cdo -remapnn,"lon=${lon}_lat=${lat}" ${infile} ${station}_out.nc
done < $coords
皆様のご意見・ご協力ありがとうございます
以下のコードはうまくいきます
#!/bin/bash
for NUM in $(seq 2016 2018)
do
infile=era_temperature_$NUM.nc
coords="coords.txt"
while read line
do
line=$(echo $line | sed -e 's/\r//g')
station=$(echo $line | cut -d ' ' -f 1)
#-- skip header line
if [[ "$station" == "station" ]]; then continue; fi
#-- select station coordinates
lat=$(echo $line | cut -d ' ' -f 2)
lon=$(echo $line | cut -d ' ' -f 3)
station="${station}_${NUM}_${lat}_${lon}"
#-- extract the station data
cdo -remapnn,"lon=${lon}_lat=${lat}" ${infile} ${station}_out.nc
done < $coords
done
ベストアンサー1
Bashfor
ループで、次の構文に従ってください。
for <variable name> in <a list of items> ; do <some command> ; done
それを分析しましょう。
for
配列を繰り返すことをシェルに通知します。
<variable name>
現在反復している配列の項目を保存する場所をシェルに提供します。
in <a list of items>
繰り返す配列を指定します。
;
スクリプト内のセミコロンまたは実際の改行文字である可能性がある改行文字を指定します。
do <some command>
はループで実行したいコマンドで、以前にforループで定義されていた変数を含めることができますが、必ずしもそうではありません。
;
今回はループ終了を準備するために改行します。
done
これでループが閉じます。
したがって、for f in $my_files
追加した内容から、後に改行文字があることがわかりますが、シェルがdo
期待したaを定義するのではなく、シェルが予期しない変数を定義しました。シェルは、これが起こるとは思わないため、構文エラーメッセージで終了します。done
ループしたいコードの終わりにも終端はありません。ループwhile
には終端がありますが、done
ループには終端はありませんfor
。
また、次のことを検討してください。lsの解析を避ける。問題が発生する可能性があります。ファイルの繰り返しなどの簡単な操作の場合は、以下を削除すると同じ操作を簡単に実行できますls
。
thegs@wk-thegs-01:test$ ls
test1.txt test2.txt test3.txt
thegs@wk-thegs-01:test$ for file in test*.txt ; do echo $file ; done
test1.txt
test2.txt
test3.txt
続行する前にループ構文を調べることも悪くありません。 Redhatは以下を提供します。アクセシビリティ文書Bashのループについては、読書を強くお勧めします(残念ながら構文解析しますls
が、完璧な人はいません)。