如何一次性合并9个分区域NetCDF文件为单个全球NC文件
首先确认前置条件:所有分块NC的变量定义、维度属性、时间轴完全一致,经纬度分块严格对齐、无重叠无缺口,匹配你所说的经度60°间隔、纬度120°间隔的划分规则,可通过以下三种方式实现一次性合并,无需重复手动执行双文件mergegrid操作:
最优方案:使用CDO的
collgrid操作符适配规则分块场景
你之前使用的mergegrid本身设计为仅支持两个输入网格的合并,对于固定经纬度间隔切分的规则瓦片网格,CDO提供了专门的collgrid操作符,支持一次性传入多个分块文件,自动按经纬度坐标匹配拼接,不需要手动排序文件、不需要生成中间临时文件,是当前场景下效率最高的方案,命令格式如下:cdo collgrid 你的分块文件通配符.nc 全球合并结果.nc例如你的分块文件都以
region_开头命名,直接执行cdo collgrid region_*.nc global_out.nc即可完成9个文件的一次性合并。注意:如果分块文件的经纬度方向存在上下/左右翻转,可添加
-invertlat或-invertlon参数提前调整单个分块的坐标方向,避免拼接错位。方案2:CDO链式嵌套调用mergegrid(适合非规则分块场景)
如果分块不是严格规则网格,无法使用collgrid,可以利用CDO的管道占位符-实现mergegrid的嵌套调用,单条命令完成多文件合并,不需要手动保存中间临时文件。9个文件按相邻网格顺序排列的命令格式参考:cdo mergegrid 分块1.nc -mergegrid 分块2.nc -mergegrid 分块3.nc -mergegrid 分块4.nc -mergegrid 分块5.nc -mergegrid 分块6.nc -mergegrid 分块7.nc -mergegrid 分块8.nc 分块9.nc global_out.nc命令中每一个
-代表承接前序操作的输出结果,整个合并流程在内存中完成,比分步合并读写中间文件的效率高很多。方案3:Shell循环自动迭代合并(适合文件命名有规律的场景)
如果觉得嵌套命令太长不好维护,也可以写极简的shell循环自动完成迭代合并,不需要手动敲多次mergegrid命令:# 初始化临时合并文件为第一个分块 cp 分块1.nc tmp_merge.nc # 循环遍历剩余分块依次合并 for ncfile in 分块2.nc 分块3.nc 分块4.nc 分块5.nc 分块6.nc 分块7.nc 分块8.nc 分块9.nc; do cdo mergegrid tmp_merge.nc $ncfile tmp_new.nc mv tmp_new.nc tmp_merge.nc done # 重命名最终结果 mv tmp_merge.nc global_out.nc
内容的提问来源于stack exchange,提问作者Li Ziming

