前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell(四)从zcat谈“流”和文件描述符

Shell(四)从zcat谈“流”和文件描述符

作者头像
一只羊
发布2019-07-27 18:58:16
4790
发布2019-07-27 18:58:16
举报
文章被收录于专栏:生信了生信了

关键词:stream;

如果有一个很大的压缩文件data.txt.gz,你要计算其第三列的平均值,可以这样做:

但是,有更好的方法,就是充分利用流(stream)。比如下面这样:

上面的方法利用zcat命令来生成流,并通过管道(pipe)将流传输给awk命令。这样就避免了解压文件的麻烦。并且,利用流往往可以减少内存的使用,因为它不用将整个文件加载到内存中

什么是流?

那什么是流呢?简单来说,流的实现就是内存里的一段buffer(缓冲数组),可以在不同程序/设备间传递数据。正如上面的例子中展示的那样。

其实,我们经常与流打交道,比如,当你登陆一个shell时,系统会默认给你开启三个“流”,分别是标准输入(流)stdin、标准输出(流)stdout、标准错误(流)stderr,分别用来处理输入信息、输出信息和错误(警告)信息。而这三个流默认都是与终端设备连接起来的

比如,当你想要打印(输出)hello world!这句话时,这几个字符就通过标准输出流输出(显示)到终端设备上:

你可以通过“>”符号来改变标准输出流的去向。比如,你要将hello world! 输出到test.txt文件中。你可以这样:

类似地,你可以通过“2>”符号来改变标准错误流的去向,比如这样:

最后提一句,”>>”符号表示将stdout的内容追加到设备(文件)中。”&>”这个符号表示同时改变stdout和stderr的去向。

文件描述符

那么,”2>”当中的2代表什么意思呢?2其实是文件描述符的意思。即用一个数字来“代表”一个流(更准确的说法是文件指针)。登陆shell时,系统给stdin分配了文件描述符0,给stdout分配了1,给stderr分配了2。所以,”2>”这个符号就可以改变stderr的去向。

你也可以自己创建文件描述符。比如,你要交换stdout和stderr所连接的设备。你可以这样做:

其中3>&1表示将文件描述符3指向与文件描述符1连接的设备;3>&-表示关闭文件描述符3。

特殊用法

shell中可以通过<(command)以及>(command)将“流”作为输入文件或输出文件。比如,我们要比较两个基因列表是否相同,可以这样:

上面<(sort gene-list-1)就起到了输入文件的作用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信了 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档