Linux服务器上如何将NetCDF时序数据按纬度分类转换为DGVM所需文本格式?
高效转换MIROC6气温NetCDF数据至DGVM格式的Shell方案
直接用CDO结合Shell循环可批量完成格点拆分、文件夹创建和数据导出,完全替代手动操作,以下是具体实现步骤:
准备工作
- 确认CDO已安装(服务器通常可通过
module load cdo加载,或自行编译安装) - 确认输入NetCDF文件的变量名(MIROC6气温变量一般为
tas,可通过ncdump -h 文件名.nc查看)
批量转换脚本
创建名为convert_dgvm_input.sh的脚本,内容如下:
#!/bin/bash # 配置参数,根据实际情况修改 INPUT_FILE="miroc6_tas_1851-1860.nc" VAR_NAME="tas" # 获取经纬度格点数量 NLAT=$(cdo nlat "$INPUT_FILE") NLON=$(cdo nlon "$INPUT_FILE") # 遍历所有格点 for ((grid_idx=0; grid_idx < NLAT*NLON; grid_idx++)); do # 计算1-based的纬度、经度索引 lat_folder=$((grid_idx / NLON + 1)) lon_file=$((grid_idx % NLON + 1)) # 创建纬度文件夹(不存在则自动创建) mkdir -p "lat_${lat_folder}" # 计算该格点的实际经纬度值(适配0.5°分辨率) lon_val=$(echo "$lon_file * 0.5 - 180" | bc) lat_val=$(echo "$lat_folder * 0.5 - 90" | bc) # 提取该格点的逐月时间序列,保存为对应文本文件 cdo output,"$VAR_NAME" -remapnn,lon=${lon_val}:lat=${lat_val} "$INPUT_FILE" > "lat_${lat_folder}/lon_${lon_file}.txt" done
脚本运行说明
- 给脚本添加执行权限:
chmod +x convert_dgvm_input.sh - 运行脚本:
./convert_dgvm_input.sh,数据量大时可后台运行:nohup ./convert_dgvm_input.sh & - 脚本完成后,会生成360个
lat_1至lat_360的文件夹,每个文件夹内包含720个lon_1至lon_720.txt文件,每个文件内为对应格点1851-1860年的逐月气温数据(每行一个月,按时间顺序循环)
替代方案(NCO实现)
如果更习惯用NCO,可将脚本内的CDO命令替换为NCO组合命令:
# 提取单个格点的NetCDF子集 ncks -v "$VAR_NAME" -d lat,$((lat_folder-1)) -d lon,$((lon_file-1)) "$INPUT_FILE" temp.nc # 将子集转为文本文件(仅保留数据行) ncdump -v "$VAR_NAME" temp.nc | grep -E '^[0-9]' | awk '{print $1}' > "lat_${lat_folder}/lon_${lon_file}.txt" # 删除临时文件 rm temp.nc
内容的提问来源于stack exchange,提问作者Kazuma
相关产品推荐
相关产品推荐

