文章目錄
- 說明
- CDO代碼
說明
需要新建.sh腳本文件,將下面的CDO代碼復制到.sh腳本中,然后運行插值程序。
CDO代碼
#!/bin/bash # ================================================
# 用戶配置區(按實際需求修改)
# ================================================
input_directory="2m_temperature" # 自定義路徑
grid_file="./target_grid_1x1.txt"
log_file="./process.log" # ====================網格參數配置============================
# ================================================
# 函數:生成北→南網格
# 89.5~-89.5, -179.5~179.5, 1x1
# ================================================
# generate_grid() {
# cat > "${grid_file}" << EOF
# gridtype = lonlat
# xsize = 360
# ysize = 180
# xname = lon
# xlongname = longitude
# xunits = degrees_east
# yname = lat
# ylongname = latitude
# yunits = degrees_north
# xfirst = -179.5
# xinc = 1
# yfirst = 89.5 # 北緯起始點
# yinc = -1 # 負向遞增
# EOF
# }
# custom_name="180_1x1" # 需要根據實際情況修改# ================================================
# 函數:生成北→南網格
# 90~-90, 0~359, 1x1
# ================================================
# generate_grid() {
# cat > "${grid_file}" << EOF
# gridtype = lonlat
# xsize = 360
# ysize = 181
# xname = lon
# xlongname = longitude
# xunits = degrees_east
# yname = lat
# ylongname = latitude
# yunits = degrees_north
# xfirst = 0 # 經度起點
# xinc = 1 # 經度間隔
# yfirst = 90 # 北緯起始點
# yinc = -1 # 負向遞增
# EOF
# }
# custom_name="360_1x1" # 需要根據實際情況修改# ================================================
# 函數:生成北→南網格
# 90~-90, 0~358 2x2
# ================================================
# generate_grid() {
# cat > "${grid_file}" << EOF
# gridtype = lonlat
# xsize = 180
# ysize = 91
# xname = lon
# xlongname = longitude
# xunits = degrees_east
# yname = lat
# ylongname = latitude
# yunits = degrees_north
# xfirst = 0 # 經度起點
# xinc = 2 # 經度間隔
# yfirst = 90 # 北緯起始點
# yinc = -2 # 負向遞增
# EOF
# }
# custom_name="360_2x2" # 需要根據實際情況修改# ================================================
# 函數:生成北→南網格
# 90~-90, -180~178 2x2
# ================================================
generate_grid() {cat > "${grid_file}" << EOF
gridtype = lonlat
xsize = 180
ysize = 91
xname = lon
xlongname = longitude
xunits = degrees_east
yname = lat
ylongname = latitude
yunits = degrees_north
xfirst = -180 # 經度起點
xinc = 2 # 經度間隔
yfirst = 90 # 北緯起始點
yinc = -2 # 負向遞增
EOF
}
custom_name="180_2x2" # 需要根據實際情況修改
# ================================================# ================================================
# 主程序流程
# ================================================
{
start_time=$(date +%s) # 初始化開始時間echo "==== 處理開始: $(date '+%Y-%m-%d %H:%M:%S') ====" # 創建小寫輸出目錄
output_directory="2m_temperature_${custom_name}" # 自定義路徑
mkdir -p "${output_directory}" || { echo "目錄創建失敗"; exit 1; }# 生成網格文件
# 如果文件存在,則不更新文件
# [ -f "${grid_file}" ] || generate_grid # # grid信息變化后,生成新的target_grid_1x1.txt文件
generate_grid# 批量處理
input_files=("${input_directory}"/*.nc) # 使用數組存儲文件列表
total=${#input_files[@]} # 獲取文件數量
count=0
errors=0# 如果沒有符合條件的文件
if [ "$total" -eq 0 ]; thenecho "沒有找到符合條件的.nc文件!"exit 1
fifor input_file in "${input_files[@]}"; do filename=$(basename -- "${input_file}")output_file="${output_directory}/${filename%.*}_${custom_name}.nc" # 進度顯示printf "處理中 [%03d/%03d] %-40s " $((++count)) $total "${filename:0:40}"# 執行插值操作 (8線程,雙線性插值)cdo -P 8 -L -O \-remapbil,"${grid_file}" \-sellonlatbox,-180,180,-90,90 \-sort "${input_file}" "${output_file}"# 最近鄰插值# cdo -P 8 -L -O \# -remapnn,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 立方插值# cdo -P 8 -L -O \# -remapcon,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 樣條插值# cdo -P 8 -L -O \# -remapspl,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 反距離夾權插值# cdo -P 8 -L -O \# -remapidw,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 分段常數插值# cdo -P 8 -L -O \# -remapidw,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 面積加權平均插值# cdo -P 8 -L -O \# -remaparea,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 保守重映射插值# cdo -P 8 -L -O \# -remapconservative,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 卡爾曼插值# cdo -P 8 -L -O \# -remapkalman,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"# 權重平均插值# cdo -P 8 -L -O \# -remapweighted,"${grid_file}" \# -sellonlatbox,-180,180,-90,90 \# -sort "${input_file}" "${output_file}"
done # 結果統計
end_time=$(date +%s)
elapsed_time=$((end_time - start_time))echo "==== 處理完成 ===="
echo "成功: $((total - errors))"
echo "失敗: $errors"
echo "耗時: ${elapsed_time}秒"
} | tee "${log_file}"