无 if else的shell脚本下载公共测序数据

shell脚本,不一定要写if else。可以通过运算符||&& 管理命令, 我的理解是通过命令返回状态$? 来决定运行哪个/块命令。

我们最常见的例子是mkdir -p test && cd $_

更加复杂的例子是运算符||&& 配合{}() 写。不要觉得没必要,这可能是你工作以后shell脚本常态。

今天以利用Aspera从ENA数据库下载测序数据为例进行简单举例。下面给个稍微简单点的一个示例命令。

背景

ascp  -vQT -l 500m -P33001 -k 1 -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR104/008/SRR1047168/SRR1047168_1.fastq.gz ./

参数-k 1 表示可接续下载。当下载完SRR21619728.fastq.gz 后,再次运行该命令时,会跳过该文件的运行,但是跳过该文件的之前会有一定的网络检测(观察后的结论)。Aspera 下载测序数据很依赖网络,有时下载一个文件可能会报错,在不同时间段运行时又可以下载。当我们把较多的下载命令均放入一个脚本时,尝试第二次运行脚本来下载第一次运行下载失败的文件时,每个成功下载的文件,都需要连接网络检测文件已下载。这样的联网对于较大的项目下载是很不利的,因此我们需要自己写个检测,来跳过已经下载好的文件,使得这个检测不再依赖网络。

运算符||与&&

该写法如下:

[[ -f ./SRR1047168_1.fastq.gz  ]] && echo "Skip: SRR1047168_1.fastq.gz" || ascp  -vQT -l 500m -P33001 -k 1 -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR104/008/SRR1047168/SRR1047168_1.fastq.gz ./  

这里并没有使用if else 写判断,而是通过运算符||&&来控制命令的运行。

先检测测序文件是否存在,如果存在则打印“Skip: SRR21619728.fastq.gz” 来提示我们跳过该文件下载,如果不存在,则尝试下载该文件。

给个项目例子

PRJNA63661 为例,这是我的一个客户要求下载的项目数据。大家可以感受下不写检测写检测时的下载完成该项目的用时。

$ run_get_bioinfo_sample_v0.3.sh PRJNA63661
$ cat ./ena_info_sample_PRJNA63661/run_downloaded_fastq_using_aspera.sh |wc -l
10871

可以看到,一共10871个文件需要下载。run_downloaded_fastq_using_aspera.sh可在百度网盘自提。

链接:https://pan.baidu.com/s/1L1KxnDZkNaJ0q4slMCm1cg?pwd=yyds
提取码:yyds
–来自百度网盘超级会员V6的分享【链接7天有效期】

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值