使用 rush 进行命令并行处理
时间:2022-07-25
本文章向大家介绍使用 rush 进行命令并行处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
rush 是一个类似于 GNU-parallel 的工具,提供了并行化命令的处理方案。官方地址是:https://github.com/shenwei356/rush,该工具由人称爪哥的生信同行用 Golang 编写而成(强!)。他开发的其他几个工具也比较有名,如 seqkit[1]、csvtk[2]。感兴趣的朋友可以访问他的博客[3]。
rush 提供的功能特性非常多,作为技术介绍文,这里我只会简单介绍它的基础核心功能。其他功能读者可以通过 GitHub 官网阅读和学习。
下载和安装
- Linux - http://app.shenwei.me/data/rush/rush_linux_amd64.tar.gz
- MacOS - http://app.shenwei.me/data/rush/rush_darwin_amd64.tar.gz
- Windows - http://app.shenwei.me/data/rush/rush_windows_amd64.exe.tar.gz 然后拷贝 rush.exe 到
C:WINDOWSsystem32
- Golang -
go get -u github.com/shenwei356/rush/
对于 Linux 和 MacOS,下载后记得将文件放到 PATH
变量支持的目录下或者添加新的 PATH 路径。
简单使用
简单运行
$ seq 1 3 | rush echo {}
1
2
3
使用 -k
保证输出顺序不变,对比下下面两个结果:
seq 1 10 | rush echo {}
8
1
2
4
7
3
6
5
10
9
$ seq 1 10 | rush -k echo {}
1
2
3
4
5
6
7
8
9
10
要并行的命令是可以包裹在引号中的,即 seq 1 10 | rush -k "echo {}"
。
通过 -i
从文件中读取数据
$ seq 1 3 > data1.txt
$ seq 4 6 > data2.txt
$ rush echo {} -i data1.txt -i data2.txt
4
6
3
1
2
5
这里比较强大在于 -i
可以多次使用。
-r
设定重试次数
这个在处理一些涉及联网的操作时应该相当有用。
seq 1 | rush 'python unexisted_script.py' -r 1
python: can't open file 'unexisted_script.py': [Errno 2] No such file or directory
[WARN] wait cmd #1: python unexisted_script.py: exit status 2
python: can't open file 'unexisted_script.py': [Errno 2] No such file or directory
[ERRO] wait cmd #1: python unexisted_script.py: exit status 2
一些有用的占位符
- 目录名
{/}
- 文件名
{%}
- 移除后缀
{^suffix}
$ echo dir/file_1.txt.gz | rush 'echo {/} {%} {^_1.txt.gz}'
dir file_1.txt.gz dir/file
- 移除文件名最后的拓展名
{%.}
- 移除文件名所有拓展名
{%:}
$ echo dir.d/file.txt.gz | rush 'echo {%.} {%:}'
file.txt file
分别使用 {.}
和 {:}
会保留目录:
$ echo dir.d/file.txt.gz | rush 'echo {.} {:}'
dir.d/file.txt dir.d/file
- job id
{#}
- 域索引
{N}
echo 12 file.txt dir/s_1.fq.gz | rush 'echo job {#}: {2} {2.} {3%:^_1}'
job 1: file.txt file s
- 使用正则表达式提取子串
{@regexp}
$ echo read_1.fq.gz | rush 'echo {@(.+)_d}'
read
-d
自定义域分隔符
$ echo a=b=c | rush 'echo {1} {2} {3}' -d =
a b c
-D
自定义记录分隔符
$ echo a b c d | rush -D " " -k 'echo {}'
a
b
c
d
❝「记录」理解为数据的行,「域」理解为数据的列。 ❞
-n
传递多行数据到命令
seq 5 | rush -n 2 -k 'echo "{}"; echo'
1
2
3
4
5
-t
设定超时
这个功能我自己认为用处不是很大,但对于处理那种长时间生信数据处理来说有时候可能会有发挥的地方。
$ time seq 1 | rush 'sleep 2; echo {}' -t 1
[ERRO] run cmd #1: sleep 2; echo 1: time out
seq 1 0.00s user 0.00s system 66% cpu 0.005 total
rush 'sleep 2; echo {}' -t 1 0.01s user 0.01s system 2% cpu 1.022 total
Reference
[1]
seqkit: https://github.com/shenwei356/seqkit
[2]
csvtk: https://github.com/shenwei356/csvtk
[3]
博客: https://bioinf.shenwei.me/
- 如何为可扩展系统进行Java Socket编程
- 如何使用Windows卷影拷贝服务恢复文件和文件夹
- .net字符串数组查找方式效率比较
- 使用Ring Buffer构建高性能的文件写入程序
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
- PDF.NET数据开发框架实体类操作实例
- 利用Burp Suite对OWASP Juice Shop进行渗透测试
- Java同步问题面试知识学习
- Android UI控件系列:LinearLayout(线性布局)
- 使用操作符重载,生成ORM实体类的SQL条件语句
- Dance In Heap(四):一些堆利用的方法(下)
- Mac系统的Proton恶意软件:卷!土!重!来!
- Erlang语言学习入门
- Android使用Ant进行apk多渠道打包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pytest 测试框架学习(11):pytest.raises
- Hibernate第二天:Hibernate的一级缓存、其他的API
- pytest 测试框架学习(12):pytest.deprecated_call
- Pinstaller(Python打包为exe文件
- pytest 测试框架学习(14):pytest.warns
- ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib
- pytest 测试框架学习(15):pytest.freeze_includes
- Linux: scp文件,目录上传下载标准版
- Hibernate第三天:Hibernate的一对多配置、Hibernate的多对多的配置
- Git: 掉坑记 -- git reset 杀手
- ModuleNotFoundError: No module named 'phkit.pinyin'
- Hibernate第四天:Hibernate的查询方式、抓取策略
- 爬虫抓取博客园前10页标题带有Python关键字(不区分大小写)的文章
- Python爬虫抓取唐诗宋词
- ImportError: /lib64/libm.so.6: version `GLIBC_2.23' not found (required by /usr/local/python37/lib/p