如何用ncks从netCDF文件提取以Var_开头的指定变量?
解决方法
要实现用ncks提取time、lon、lat以及所有以Var_开头的变量,不能直接用Var_*(这是shell文件通配符,而非netCDF变量名通配符),需要先获取符合条件的变量列表,再传入ncks:
- 获取目标变量列表
用ncks自带的变量名输出功能,结合grep筛选出所有以Var_开头的变量:
var_list=$(ncks -s '%N\n' input.nc | grep '^Var_')
这里-s '%N\n'让ncks每行输出一个变量名,grep '^Var_'只保留以Var_开头的变量。
- 拼接变量字符串
把筛选出的变量转换成逗号分隔的格式,再和固定变量time、lon、lat拼接:
var_str=$(echo "$var_list" | paste -sd ',' -) full_vars="time,lon,lat,$var_str"
- 执行ncks提取
将拼接好的变量列表传入ncks的-v参数:
ncks -C -v "$full_vars" input.nc output.nc
完整bash脚本示例
#!/bin/bash # 定义输入输出文件 input_file="input.nc" output_file="output.nc" # 获取Var_开头的变量列表并格式化 var_list=$(ncks -s '%N\n' "$input_file" | grep '^Var_') var_str=$(echo "$var_list" | paste -sd ',' -) # 处理无Var_开头变量的情况,避免多余逗号 if [ -n "$var_str" ]; then full_vars="time,lon,lat,$var_str" else full_vars="time,lon,lat" fi # 执行提取 ncks -C -v "$full_vars" "$input_file" "$output_file"
补充说明
原命令中Var_*失效的原因:这是shell的文件通配符,只有当前目录存在匹配的文件时才会展开,否则会原样传给ncks,而ncks不支持这种通配符语法,导致无法正确筛选变量。
内容的提问来源于stack exchange,提问作者I.M.
相关产品推荐
相关产品推荐

