全国工程信息查询平台/贵港seo
- 背景
相信小伙伴们在平时的科研中会经常接触到大数据,进行数据处理时往往也需要运行很多很多很多脚本(手动一个个提交的话简直心态爆炸有木有!╥╯^╰╥)。接下来我将根据自己的一些经验介绍几个简单的批量执行脚本的方法给刚开始接触科研的小伙伴们(大神可以选择忽略哈哈哈)。
- 举个例子
以提交NCL脚本为例(话说NCL官网要停更可以说是很难受了。。。)。众所周知,在运行NCL脚本时最最忌讳的东西就是—“循环”,因为它不仅大大降低了运行效率,长时间的运行还会让程序出错甚至崩溃。假设我需要读取同一文件夹下的1000个数据并对其进行操作,该如何在NCL脚本里实现呢?
低级方法:通过systemfunc("ls *.nc")这一函数来实现。但是我想说,对于处理较少的数据量这么做是完全没问题的,但是如果数据量达到几十万甚至上百万(注意我说的是数据量,不是数据的绝对大小)这样往往是不可行的,一方面是运行效率会很低,另一方面程序很可能会意外终止。
详见
小结NCL处理数据的优势与不足-编程作图-气象家园_气象人自己的家园bbs.06climate.com装逼方法:“软链接”!!!可以完美做到避免NCL脚本中出现循环。
所以啥是“软链接”?一脸懵逼?没关系,请接着往下看。

- “软链接”
所谓的“软链接”其实就是Linux下当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间。例如:ln -s /bin/less/usr/local/bin/less,-s 是代号(symbolic)的意思。具体用法:ln -s 源文件 目标文件。这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,-s千万不能忘记,如果漏了它就会变成“硬链接”,即真的复制源文件到指定目录,这里不具体介绍。
- 实例讲解1——读取grb等文件
接下来实例说明:

这个目标文件下下有很多数据文件,我们需要在NCL (r.ncl) 脚本中对每一个进行读取并加以处理(systemfunc的方法就不介绍了)。
我们只需要简单的用一行命令即可解决,该文件为r.ncl,代码如下。

你肯定会问“a.grb1”是个啥?原文件夹里有这玩意儿吗??
嘿嘿先别急哈,听我继续说~
下面,我们需要写一个简单的a.sh的Shell脚本来进行批处理:

步骤讲解:
- for循环中i就代表后缀为.grb1的数据名,比如第一次循环提取出第一个文件或者数据的文件名。
- 然后讲这个文件或者数据链接到“a.grb1”上。
- 执行ncl脚本,对a.grb1文件(即第一次循环提取出的第一个文件或者数据)里面的数据进行处理,执行编写的ncl脚本里面的内容。每次NCL脚本都是在读取“a.grb1”这个文件。
- NCL脚本处理完了之后再通过rm删除“a.grb1”这个镜像文件,方便进行下一个数据的处理。
- 然后开始执行下一个循环,对第二个文件或者数据进行(1)—(4)步骤的处理。
这样做的本质其实是将数据名循环读取的步骤放到了NCL脚本的外部,很好得避免了脚本中出现大量的循环,不仅使运行效率大大提高,还让我们的NCL编程变得简洁许多。
最后只要轻松优雅地键入“sh a.sh”就可以完成啦!里面相当于执行了若干次的ncl r.ncl的命令。(对于以上Shell命令有疑惑的小伙伴们可以问问度娘哈,网上有非常全面的讲解)。
注:可能有小伙伴会问,那这样我运行sh a.sh,但好像只是运行数据就完事了,但是我不能对这个数据进行处理啊。其实我们可以丰富r.ncl里面的内容,比如我们可以将读取的数据另存到一个新的grb或者nc文件中。最后,执行完sh a.sh之后我们则可以读取总的grb和nc文件,这样就会大大节约时间。当然了,具体情况还是需要具体分析,这里只是提供一个思路。
- 实例讲解2——批量运行ncl可执行文件
可能又有小伙伴会问,假如我有100个不同的NCL脚本,该怎样实现批量运行呢?这个相对于上面讲的方法就简单多啦,我们只需要在Linux输入“ls *.ncl > a.sh”,这样就得到一个包含全部需要执行的NCL文件名的a.sh文件:

接下来我们可以使用Sublime txt编辑器长按鼠标右键拖动选中第一列后,统一加上一句“ncl”即可,就像这样:

然后,再键入“sh a.sh”就可以实现批量执行NCL脚本啦~
注:Sublime txt编辑器是一款我个人非常喜欢的很适合新手使用的编辑器,包含NCL、FORTRAN在内很多程序语言,语法高亮可自动补齐,下载链接:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=50605bbs.06climate.com关注“happy科研”公众号和CSDN博客(ID:weixin_44267600),获取更多有趣有料的干货。
有任何问题,请发邮件至:yfangnuist@gmail.com