【问题标题】:Piping commands withing GNU parallel (samtools)使用 GNU 并行 (samtools) 的管道命令
【发布时间】:2021-07-15 02:29:25
【问题描述】:

我正在尝试在管道时并行运行命令。原因是中间文件太大而无法保存,所以我可以丢弃它们

我有以下代码,它们可以单独工作:

#fixmate and convert to bam
parallel --verbose --link -j 4  'samtools fixmate -O bam,level=1 {1} /home/Teste1/samtools/unsorted/{/.}.bam -@ 8' ::: /home/Teste1/star/twopassoverhang/*.fqAligned.out.sam 

#sort according to coordinate
parallel --verbose --link -j 4  'samtools sort {1} -o /home/Teste1/samtools/sorted/{/.}-sorted.bam -@ 8' ::: /home/Teste1/samtools/unsorted/*.bam

#index bam files
parallel --verbose --link -j 4  'samtools index {1} -@ 8' ::: /home/Teste1/samtools/sorted/*-sorted.bam

我试过了:

parallel --verbose --link -j 4  'samtools fixmate -O bam,level=1 {1} - -@ 4 | / #fixmate and output bam to nextcommand
samtools sort - - -@ 4 | / #sort bams
tee /home/Teste1/samtools/sorted/{/.}-sorted.bam | / #save sorted bam file to disk
samtools index - -@ 4' ::: /home/Teste1/star/twopassoverhang/*.fqAligned.out.sam  #creates index

但我通过 --dry-run 得到以下信息:

 samtools fixmate -O bam,level=1 '/homeTeste1/star/twopassoverhang/101_FRAS202421991-1a_1.fqAligned.out.sam' - -@ 4 |
 samtools sort - - -@ 4 |
 tee /home/Teste1/samtools/sorted/101_FRAS202421991-1a_1.fqAligned.out-sorted.bam |
 samtools index - -@ 4

跑步给了我:

samtools index: "-" is in a format that cannot be usefully indexed
samtools fixmate -O bam,level=1 '/home/Teste1/star/twopassoverhang/12_FRAS202372578-2r_1.fqAligned.out.sam' - -@ 4 | samtools sort - - -@ 4 | tee /home/Teste1/samtools/sorted/12_FRAS202372578-2r_1.fqAligned.out-sorted.bam | samtools index - -@ 4
[bam_sort] Use -T PREFIX / -o FILE to specify temporary and final output files
Usage: samtools sort [options...] [in.bam]

我尝试了其他一些变体,但没有成功。有什么想法吗?

【问题讨论】:

    标签: pipe gnu gnu-parallel samtools


    【解决方案1】:

    这可能有效:

    do_one() {
      sam="$1"
      sorted="$2"
      #fixmate and convert to bam
      samtools fixmate -O bam,level=1 "$sam" - -@ 8 |
        #sort according to coordinate
        samtools sort -T /home/Teste1/samtools/ - -o "$sorted" -@ 8
    
      #index bam files
      samtools index "$sorted" -@ 8
    }
    export -f do_one
    
    parallel do_one {} /home/Teste1/samtools/sorted/{/.}-sorted.bam ::: /home/Teste1/star/twopassoverhang/*.fqAligned.out.sam 
    

    如果您无法让samtools 直接在管道上工作,那么您可能希望在完成后立即删除中间文件:

    do_one() {
      sam="$1"
      bam="$2"
      sorted="$3"
      #fixmate and convert to bam
      samtools fixmate -O bam,level=1 "$sam" "$bam" -@ 8
    
      #sort according to coordinate
      samtools sort "$bam" -o "$sorted" -@ 8
    
      #index bam files
      samtools index "$sorted" -@ 8
    
      # remove unsorted
      rm "$bam" 
    }
    export -f do_one
    
    parallel do_one {} /home/Teste1/samtools/unsorted/{/.}.bam /home/Teste1/samtools/sorted/{/.}-sorted.bam ::: /home/Teste1/star/twopassoverhang/*.fqAligned.out.sam 
    

    【讨论】:

      最近更新 更多