首页 > 解决方案 > 如何使用 ncatted 添加或编辑大量全局属性?

问题描述

是否有使用ncatted编辑和/或添加大量全局属性的便捷方法?也许通过将每个att_dsc指定到外部文件并将其作为参数传递?

编辑:我不工作的解决方案是:ncatted -h $(cat global_attributes | xargs -d '\n') file.in file.out

而在global_attributes我有一个att_dsc列表如下:

-a institution,global,m,c,"Super Cool University"
-a source,global,c,c,"My Awesome Radar"
-a contributors,global,c,c,"Enrico Fermi, Galileo Galilei, Leonardo Da Vinci"

这里的问题似乎是包含多个单词的字符串的引号!

标签: bashnetcdfnco

解决方案


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 不同,因此应小心为其制定任何参数。尽管如此,上述程序对我有用。


推荐阅读