通常情况下我们的处理是针对多个样品的,比如多样品质控、多样品比对、多样品定量等。这时就需要用到循环来简化、优化计算了。

假如我们有一个命令如下(这是群里的提问,这条命令是把质量值编码 Phred64 转为 Phred 33)

# 输入文件 sample1.fq
# 输出文件 sample1_33.fq
vsearch --fastq_convert sample1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample1_33.fq

这条命令可以处理单个文件,假如有 3 个文件呢?这难不倒勤奋的小能手。

把命令写 3 遍,改6 次样本名。

# 输入文件 sample1.fq
# 输出文件 sample1_33.fq
vsearch --fastq_convert sample1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample1_33.fq
vsearch --fastq_convert sample2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample2_33.fq
vsearch --fastq_convert sample3.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample3_33.fq

如果有 100 个文件呢?把命令写 100 遍,改200 次样本名。

倒也不是太难的事!

但应该有好一点的办法。

这就用到我们前面提到的for循环了。for循环有个固定格式for .. in .. do .. done,我们看看是怎么工作的。

for i in `seq 1 3`; do echo $i; done

这个命令本身没啥意义,只是展示for的语法,变量i依次被赋值为了1,2,3,并且打印了出来,输出为:

1
2
3

假如你的样本名正好是sample1, sample2, sample3,那可以套用下。

for i in `seq 1 3`; do echo "sample"$i".fq"; done

输出为 各个样本的测序结果文件名

sample1.fq
sample2.fq
sample3.fq

这样就通过命令的方式实现了各个样本文件的遍历。下一步,怎么把上面转换编码格式的命令套进来呢?

# 把变量 i 把每次循环获得的值转换为样本名字
for i in `seq 1 3`; do vsearch --fastq_convert "sample"$i".fq" --fastq_ascii 64 --fastq_asciiout 33 --fastqout "sample"$i"_33.fq"; done

这个代码写好了,对不对呢,可以打印一下看看:

# 命令前加一个 echo
for i in `seq 1 3`; do echo vsearch --fastq_convert "sample"$i".fq" --fastq_ascii 64 --fastq_asciiout 33 --fastqout "sample"$i"_33.fq"; done

打印出来,与前面自己手写的比较下,一模一样。这样就实现了循环了,去掉 echo 就可以实际运行了。

vsearch --fastq_convert sample1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample1_33.fq
vsearch --fastq_convert sample2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample2_33.fq
vsearch --fastq_convert sample3.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout sample3_33.fq

假如样本名没有统一的规律,或者更复杂一些呢?

一般是需要准备一个metadata.txt的文件,里面至少包含两列信息,样本名字样本分组

需要注意的是:metadata.txt中样本名字需要与样本的测序结果文件存在统一的对应关系

假如我们有4个样品,名字如下,我们写一个metadata.txt文件 (这里我们只用到了第一列):

Sample      Group
WT1      WT
WT2      WT
KO1      KO
KO2      KO

对应的序列分别为WT1.fq, WT2.fq, KO1.fq, KO2.fq

# 命令前加一个 echo
for i in `tail -n +2 metadata.txt | cut -f 1`; do echo vsearch --fastq_convert $i".fq" --fastq_ascii 64 --fastq_asciiout 33 --fastqout $i"_33.fq"; done

输出如下,可以直接拷贝运行,或去掉上面语句中的echo就可以直接运行了。

vsearch --fastq_convert WT1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout WT1_33.fq
vsearch --fastq_convert WT2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout WT2_33.fq
vsearch --fastq_convert KO1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO1_33.fq
vsearch --fastq_convert KO2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO2_33.fq

for语句用起来方便,但样品多时只能所有样品串行运行或同时并行运行(当然也可能可以用wait控制并行的数量)。这里推荐另外一个工具rush, 这是重庆医科大学沈伟博士开发的一个并行工具,https://github.com/shenwei356/rush,很好用。跨平台,免安装,下载即可用。

tail -n+2 metadata.txt | cut -f1 | rush -j 2 \"echo vsearch --fastq_convert {1}.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout {1}_33.fq"

运行输出如下,除了命令顺序有变化,看上去与for没什么不同。关键参数有 2 个:

  1. -j 2表示同时运行 2 个样本,所以下面的输出顺序才有些乱;

    如果去掉 echo,会发现同时有 2 个样本正在转换。

    当然这里的 2 可以改为任意非 0 的正数,控制同时运行的命令数目。

  2. {1}: 样本名会替换在这里。

vsearch --fastq_convert WT1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout WT1_33.fq
vsearch --fastq_convert WT2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout WT2_33.fq
vsearch --fastq_convert KO2.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO2_33.fq
vsearch --fastq_convert KO1.fq --fastq_ascii 64 --fastq_asciiout 33 --fastqout KO1_33.fq

如果你习惯用parallel也可以。

往期精品(点击图片直达文字对应教程)

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

讨论群问题:Linux 下的批量操作,第2种很赞相关推荐

  1. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  2. 【转】Linux下软件安装的几种方式

    转自Linux下软件安装的几种方式 Linux 系统的/usr目录 Linux 软件安装到哪里合适,目录详解 Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统 ...

  3. linux系统调用劫持隐藏进程,linux 下隐藏进程的一种方法及遇到的坑

    前言 1.本文所用到的工具在 https://github.com/gianlucaborello/libprocesshider 可以下载 2.思路就是利用 LD_PRELOAD 来实现系统函数的劫 ...

  4. 【Oracle 集群】Linux下Oracle RAC集群搭建之基本测试与使用(九)

    Oracle 11G RAC数据库安装(九) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总 ...

  5. linux下安装oracle集群,【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)...

    目录 数据库安装 继oracle集群安装之后,接下来也是最重要的数据库安装,整个数据库安装难度不大,用户以oracle用户身份登录RAC1主节点,对解压后的文件安装.主节点下安装后,其他所有结点自动安 ...

  6. linux下使用nginx搭建集群,CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群第一步)

    CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群) CentOS 7.4(腾讯云) pcre库 zlib库 openssl Nginx服务器 安装gcc g++开发类库 y ...

  7. Elasticsearch——Windows下ES集群部署 Linux下ES单节点、集群部署

    1.开篇 在之前的两篇文章中,说白了就是在windows下部署的ES单节点的环境. 这篇文章主要是说一下windows下部署ES集群.Linux下单节点部署. 单台 Elasticsearch 服务器 ...

  8. 关于在linux下清屏的几种技巧

    在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...

  9. Linux下之使用简单3种创建文件的命令,并实现一个Html和JavaScript小程序

    1.今天来说一下在linux下如何实现一个JavaScript程序,这个很简单,如果大家想要在linux下搞web开发,服务器架设,大数据等方面,就得继续努力了! 2.首先,我们要实现一个JavaSc ...

  10. 在linux下进行嵌入式系统设计,一种应用于测控系统的基于Linux的嵌入式系统的设计...

    描述 1.前言 随着网络控制技术的快速发展,工业以太网得到逐步完善,在工业控制领域获得越来越广泛的应用.工业以太网使用了TCP/IP协议,便于联网,并具有高速控制网络的优点.随着32位嵌入式CPU价格 ...

最新文章

  1. LeetCode简单题之学生出勤记录 I
  2. javascript面向对象系列第一篇——构造函数和原型对象
  3. python中文件读写位置的作用-Python中文件的读写
  4. when busy dialog closed iDuration renderFioriFlower jQuery Animation closeL
  5. 怎么解决交换机端口不正常问题?
  6. java 异常处理线程_转:Java子线程中的异常处理(通用)
  7. 【渝粤题库】陕西师范大学800008 综合自然地理
  8. FLC-Regular Grammar
  9. 多御安全浏览器升级1.7.6版,新增扫描二维码功能
  10. 创意扁平商业计划书PPT模板
  11. 魔兽世界服务器同时在线人数,魔兽世界服务器人数,魔兽世界服务器人数查询...
  12. 二阶梯度优化新崛起,超越 Adam,Transformer 只需一半迭代量
  13. 13.5 Prepared Statements
  14. 论文精读 清华ERNIE:Enhanced Language Representation with Informative Entities
  15. zkeys阿帕云对接易支付插件,支持zkeys阿帕云最新版(亲测可用)
  16. python改变数组形状_NumPy数组的变形(改变数组形状)
  17. java权威指南电子书下载,Java性能权威指南pdf
  18. ArcGIS Runtime Esri新的离线地图数据格式——移动地图包(转载自Esri中国)
  19. 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
  20. 解决spirng无法注入redis工具类及dao层类(Springboot项目)

热门文章

  1. 【数据结构与算法】双链表V2.0的Java实现
  2. 不用long的危害(记洛谷P5534题的WA经历,Java语言描述)
  3. JavaSE——链表集合
  4. 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式
  5. Android UI开发第八篇——ViewFlipper 左右滑动效果
  6. mac 下基于firebreath 开发多浏览器支持的浏览器插件
  7. JVM并发机制探讨—内存模型、内存可见性和指令重排序
  8. 网卡 远程唤醒问题故障排除
  9. 互联网、SaaS的技术挑战与机遇
  10. 初学者注意:你需要明白编程的意义所在,否则是学不好编程的!