文章目录
- 说明
- 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}"