ncatted 支持两种互补的大规模属性修改方法:正则表达式和多选项。所有符合正则表达式的变量都可以同时修改其属性,并且每次调用可以多次使用-a aed_sct 选项:
ncatted -a units,temperature.?,o,c,kelvin -a foo,bar,o,c,davegrohl in.nc out.nc
所有这些都记录在案here。
编辑:刚刚注意到 OP 想要全局属性。有一个 NCO 范围的选项 --glb_att_add 在这里可能做得很好,因为这些选项可以用冒号分隔。记录在here。
ncks --glb machine=${HOSTNAME}:created_by=${USER}:... in.nc out.nc
编辑 20210907:刚刚注意到您通过巧妙地使用 xargs 更新了您的问题。你离解决这个问题太近了!尝试在输入文件中的每个双引号前加上反斜杠,例如 \"foo bar\" 这应该保持引号完整,以便 shell 正确传递参数。
编辑 20210910:如下面的 cmets 所述,直接在命令行上直接替换 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 不同,因此应小心为其制定任何参数。尽管如此,上述过程对我有用。