ncatted
支持两种互补的大规模属性修改方法:正则表达式和多选项。适合正则表达式的所有变量都可以同时修改其属性,并且-a aed_sct
每次调用可以多次使用该选项:
ncatted -a units,temperature.?,o,c,kelvin -a foo,bar,o,c,davegrohl in.nc out.nc
这都记录在这里。
编辑:刚刚注意到 OP 想要全局属性。有一个 NCO 范围的选项 --glb_att_add 在这里可能做得很好,因为这些选项可以用冒号分隔。记录在这里。
ncks --glb machine=${HOSTNAME}:created_by=${USER}:... in.nc out.nc
编辑 20210907:刚刚注意到您巧妙地使用了xargs
. 你离解决这个问题太近了!尝试在输入文件中的每个双引号前加上反斜杠,例如,\"foo bar\"
这应该保持引号完整,以便 shell 正确传递参数。
编辑 20210910:正如下面的评论中提到的,直接在命令行上直接替换 xargs 的结果是行不通的(为什么?)。但是,一个简单的解决方法是使用xargs
构造命令字符串,并使用 执行该字符串eval
,如下所示:
cat > opt.txt << EOF
-a institution,global,o,c,\'Super Cool University\'
-a source,global,o,c,\'My Awesome Radar\'
-a contributors,global,o,c,\'Enrico Fermi, Galileo Galilei, Leonardo Da Vinci\'
EOF
opt=$(cat opt.txt | xargs)
cmd="ncatted -O ${opt} in.nc out.nc"
eval $cmd
请注意使用反斜杠来保护选项文件中的引号不受 shell 影响。此外,GNU 的xargs
行为与 MacOS 不同,因此应小心为其制定任何参数。尽管如此,上述程序对我有用。