【问题标题】:Extract data from several netcdf files using ncks in for loop在 for 循环中使用 ncks 从多个 netcdf 文件中提取数据
【发布时间】:2019-07-01 10:23:30
【问题描述】:

我正在尝试从 netcdf 文件中提取某些变量。 如果我将以下代码应用于单个文件,则以下代码有效:

ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc

另请参阅问题:Hyperslab of a 4D netcdf variable using ncks 以获得解释。 现在我想在几个具有以下名称的 .nc 文件上使用此代码:

20091208000001.nc
20091208000002.nc
20091208000003.nc

我尝试了以下循环:

# !bin/bash
for ((x=1;x<=3;x+=1))
do
ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 2009120800000$x.nc testU.nc
done

我得到了错误

ncks: ERROR received 4 filenames; need no more than two

如何让循环一次只从一个文件中提取,然后将所有文件中提取的输出附加到一个输出文件中?

【问题讨论】:

  • 对于每次循环迭代,从 20091208000001.nc 到 ..3.nc 的每个文件都会被处理。所以它基本上是一次一个文件。这有什么问题
  • 我不知道它应该工作。这就是我发布它的原因。我在输出中收到此错误 4 次。

标签: linux bash netcdf nco


【解决方案1】:

我认为 ni_u,234,235,1 被误认为是另一个文件名。在此之前,您需要另一个 -d

如果您正在处理多个 nc 文件,您可能需要重命名 testU.nc 以使它们不重叠,或者您可以使用 ncrcat 连接到一个文件中。例如

ncrcat -C -F -d nj_u,151,152,1 -d ni_u,234,235,1 -v vel_u 2009120800000?.nc testU.nc

【讨论】:

  • 如果这是原因(这是有道理的,顺便说一句),那么在问题中提出的代码在循环外正常工作的说法将是错误的:-(
  • @Poshi 是的,我知道,前一天它工作得很好,我没有看到 -d 丢失了。经验教训...
  • 这就是我要求你重新运行命令的原因,我写了你必须测试的确切命令,你只需剪切和粘贴并检查语句是否正确。顺便说一句,纠正这个问题会很好,这样答案才有意义。
【解决方案2】:

我在您的脚本中发现了一些错误,但没有任何可能导致您的实际错误。

  • shebang 行不应包含空格且路径应为绝对路径
  • for 条件中有一个逗号,应该是分号

    #!/bin/bash
    
    for ((x=1;x<=3;x+=1))
    do
        ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 2009120800000$x.nc testU.nc
    done
    

当我将 echo 添加到您要运行的命令之前,我会得到以下结果:

ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000001.nc testU.nc
ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000002.nc testU.nc
ncks -C -F -d nj_u,151,152,1 ni_u,234,235,1 -v vel_u 20091208000003.nc testU.nc

三个调用,每个调用一个文件。该代码正在运行。好像还有别的东西。您是在简化代码还是向我们展示完整代码?

【讨论】:

  • 我纠正了错误,仍然是同样的错误。我使用 bash namescript.sh 来运行它。
  • @Jellyse 我用我得到的结果更新了我的答案。
  • 这是我在 testing.sh 文件中的完整代码 该文件夹只有这三个文件和 testing.sh 文件。是否可能 nco 没有正确安装?
  • 好的,我重新安装了,还是一样的错误。我唯一能想到的是,在我的计算机上的某个地方有另一个同名的文件,这就是它混淆的原因。
  • @Jellyse,将 echo 添加到您的命令 (echo ncks -C......) 并检查输出。计算机中有其他同名文件不会导致此错误。
【解决方案3】:

@Packard 在这两个方面都是正确的。此外,步幅为 1 是默认值,因此不需要。因此

ncrcat -C -F -d nj_u,151,152 -d ni_u,234,235 -v vel_u 2009120800000${x}.nc testU${x}.nc

【讨论】:

    【解决方案4】:

    我根据我想要的维度(纬度,经度)编辑了上面的代码

    ncrcat -C -F -d nj_u,151,152,1 -d ni_u,234,235,1 -v vel_u 2009120800000?.nc testU.nc
    

    反馈是这样的:

    提示:如果操作失败,请尝试 multislabbing (http://nco.sf.net/nco.html#msa) 首先使用 ncks 包装尺寸, 然后将 ncrcat 应用到生成的文件中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多