前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 rush 进行命令并行处理

使用 rush 进行命令并行处理

作者头像
王诗翔呀
发布2020-09-25 17:55:24
1.4K0
发布2020-09-25 17:55:24
举报
文章被收录于专栏:优雅R优雅R优雅R

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:\WINDOWS\system32
  • 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/

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

本文分享自 优雅R 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下载和安装
  • 简单使用
    • 简单运行
      • 通过 -i 从文件中读取数据
        • -r 设定重试次数
          • 一些有用的占位符
            • -d 自定义域分隔符
              • -D 自定义记录分隔符
                • -n 传递多行数据到命令
                  • -t 设定超时
                    • Reference
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档