如何使用 ncatted 添加或编辑大量全局属性?

how can I add or edit lot of global attributes with ncatted?

有没有方便的方法编辑 and/or 使用 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"

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

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:如以下评论中所述,直接在命令行上简单地替换 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 不同,因此应注意为其制定任何参数。尽管如此,上述程序对我有用。