首页 > 系统相关 >shell编程小技巧:进程替换

shell编程小技巧:进程替换

时间:2024-10-20 21:23:12浏览次数:5  
标签:文件 shell users Python 编程 num tsv 替换

今天来给大家介绍一个非常好用的shell编程技巧,即进程替换(Process substitution)。

进程替换可以将一个进程(程序)的输入或输出当做一个文件来使用。

它的两种使用形式为:<(cmd)>(cmd) .

需要注意的是,<>(之间不能有空格!

下面通过一个示例来介绍进程替换的具体用法。

假如我有一个几种编程语言的使用用户数目的文件,其内容如下(虚构数字请勿当真):

$ cat num_users.tsv 
programming_language    num_users
Python  2000
Linux   3000
R       3500
C       2000
Java    2000

此时我还有一个几种编程语言的起源时间的文件,其内容如下:

$ cat history.tsv 
programming_language    orgin_date
R       1980
Python  1989

如果我想通过第二个文件(history.tsv)从第一个文件(num_users.tsv)中取出来R和Python的用户数目,那么可以运行的命令为:

$ cut -f1 history.tsv |sed '1d' > a # 首先取出第一列,并去掉第一行(header)

$ cat a # 其内容如下
R
Python

$ grep -Fwf a num_users.tsv # 在num_users.tsv文件中搜索文件a中的内容,搜索结果如下
Python  2000
R       3500

可以发现上面一共用了三行命令,其过程为:

  • 首先将history.tsv文件的内容取出来存入到一个临时文件a
  • 其次使用grepnum_users.tsv文件中搜索文件a中的关键词

如果使用了进程替换,那么将不需要产生临时文件a,其命令如下:

$ grep -Fwf <(cut -f1 history.tsv |sed '1d') num_users.tsv 
Python  2000
R       3500

在上述命令中<(cut -f1 history.tsv |sed '1d')的内容与前面文件a的内容完全一致,且作用也一样,因此可以得到相同的结果。

可以发现,使用了进程替换以后便可以一行命令完成上述需求,无需产生中间文件。

进程替换的应用还有很多,这里再举另一个比较简单的例子,即比较两个文件的第一列是否一致。

这两个文件(a.tsvb.tsv)的内容如下:

$ cat a.tsv 
programming_language    orgin_date
R       1980
Python  1989

$ cat b.tsv 
programming_language    num_users
R       3500
Python  2000

由于这两个文件的第一列一样,但是后面的列不同,所以不能直接使用diff命令来比较这两个文件。

要比较这两个文件的第一列是否一致,传统的命令如下:

$ cut -f1 a.tsv > 1
$ cut -f1 b.tsv > 2
$ diff 1 2

而使用进程替换的命令如下:

$ diff <(cut -f1 a.tsv) <(cut -f1 b.tsv)

一行命令即可搞定!非常简洁!

参考链接:https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html

最后

本文同步发表于微信公众号:水木的生信与编程世界,如果觉得本文对您有帮助欢迎关注公众号,我会持续分享更多关于生信的分析经验和实用技巧。

标签:文件,shell,users,Python,编程,num,tsv,替换
From: https://www.cnblogs.com/jwang-48/p/18487706

相关文章

  • 10.18Python基础迭代器生成器_函数式编程
    Python迭代器与生成器1.迭代器Iterator什么是迭代器迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用,而不会像列表那样在迭代时被修改。迭代器函数iter和next函数说明iter(iterable)从可迭代对象中返回一个迭代器,iterabl......
  • 事务 - 编程式事务
    packagecom.example.demo.service;importcom.example.demo.mapper.UserMapper;importcom.example.demo.model.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.tran......
  • 白嫖正版xshell和XFTP
    在哪里可以下载正版免费的xshell和XFTP,并且还能够获得官网免费持久更新白嫖步骤首先直接在浏览器搜索xshell官网点进官网之后直接点击下载接着点击免费授权页面进入之后就可以免费下载了下载安装完成后填写用户名和邮箱并提交,这里就以xshell为例,XFTP同理,这里就不......
  • C系统编程通信方式——共享内存
        共享内存,标准IPC之一,也是进程间通信最快的一种方式。1.概念    所有的标准IPC都有一个内部ID作为唯一标识。内部ID的获取通过外部key,key的类型是key_t。key的获取方法有在头文件中定义所有key和通过ftok函数获取一个key。key_tftok(constchar*pathna......
  • 基于nodejs+vue基于web的青少年编程课程评价系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于青少年编程课程评价的研究,现有研究主要以传统课程评价为主,专门针对青少年编程课程这一新兴教育领域的评价研究较少。在国内外,传统课程评价体系已经......
  • 基于node.js+vue基于Android的“编程猿”学习App设计与实现(开题+程序+论文)计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于基于Android的学习类App的研究,现有研究主要以通用型学习App为主,如语言学习类、考证辅导类等。专门针对编程学习领域的Android应用研究较少。因此本......
  • 三,Java编程基础:深入理解数据类型与类型转换
    数据类型与类型转换在Java编程中,数据类型是定义变量存储数据的格式。Java是一种强类型语言,这意味着每个变量和表达式都有一个明确的数据类型。本文将深入探讨Java中的基本数据类型、引用数据类型以及类型转换,包括详细的示例和代码。基本数据类型Java的基本数据类型分为整数类型......
  • SHELL
    shell脚本运行4种方法:1.chmoda+xmyshell.sh./myshell.sh2..myshell.sh3.sourcemyshell.sh4./bin/bashmyshell.shshell语法:数据类型:字符串String 变量: 全局变量----环境变量 局部变量----本地变量 变量名=变量值 VAR=10 对比: $变量名......
  • C++编程-贪心算法2
    目录先言例题三:删数问题(NOI1994)题目描述算法分析标准程序-字符串String例题四:拦截导弹问题题目描述算法分析主要框架(标准程序)例题五:活动选择题目描述算法分析标准程序先言今天讲贪心算法的第3~5例题例题三:删数问题(NOI1994)题目描述【题目描述】输......
  • 编程小白如何成为大神:大学新生的最佳入门攻略
    编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。以下是大学新生入门编程的最佳路径,帮助你为大学生活和未来职业发展打下坚实基础。方向一:编程语言选择1.Python特点:语法简洁易懂,适合初学者;拥有丰富的库和框架。应用领域:数据分析、人工智......