代码之家  ›  专栏  ›  技术社区  ›  user3224522

如何在snakemake管道中运行bash脚本

  •  0
  • user3224522  · 技术社区  · 4 年前

    我想在snakemakepipeline中运行bash脚本。但我不知道如何在bash脚本中调用snakemake的输入和输出。

    蛇形:

    rule xxx:
        input:
            "input.vcf"
        output:
            "output.tab"
        shell:
            """
            some_bash.sh {input} {output}
            """
    

    bash脚本:

    #!/bin/bash
    
    paste <(bcftools snakemake@input[0] |\
        awk -F"\t" 'BEGIN {print "CHR\tPOS\tID\tREF\tALT\tFILTER"} \
          !/^#/ {print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}') \
        \
      <(bcftools query -f '[\t%SAMPLE=%GT]\n' snakemake@input[0] |\
        awk 'BEGIN {print "nHet"} {print gsub(/0\|1|1\|0|0\/1|1\/0/, "")}') \
        \
      <(bcftools query -f '[\t%SAMPLE=%GT]\n' snakemake@input[0] |\
        awk 'BEGIN {print "nHomAlt"} {print gsub(/1\|1|1\/1/, "")}') \
        \
      <(bcftools query -f '[\t%SAMPLE=%GT]\n' snakemake@input[0] |\
        awk 'BEGIN {print "nHomRef"} {print gsub(/0\|0|0\/0/, "")}') \
        \
      <(bcftools snakemake@input[0] | awk -F"\t" '/^#CHROM/ {split($0, header, "\t"); print "HetSamples"} \
        !/^#CHROM/ {for (i=10; i<=NF; i++) {if (gsub(/0\|1|1\|0|0\/1|1\/0/, "", $(i))==1) {printf header[i]","}; if (i==NF) {printf "\n"}}}') \
        \
      <(bcftools snakemake@input[0] | awk -F"\t" '/^#CHROM/ {split($0, header, "\t"); print "HomSamplesAlt"} \
        !/^#CHROM/ {for (i=10; i<=NF; i++) {if (gsub(/1\|1|1\/1/, "", $(i))==1) {printf header[i]","}; if (i==NF) {printf "\n"}}}') \
        \
      | sed 's/,\t/\t/g' | sed 's/,$//g' > snakemake@output[0]
    

    我得到的错误:

    [E::main] unrecognized command 'snakemake@input[0]'
    [E::main] unrecognized command 'snakemake@input[0]'
    [E::main] unrecognized command 'snakemake@input[0]'
    [E::hts_open_format] [E::hts_open_format] Failed to open file "snakemake@input[0]" : No such file or directoryFailed to open file "snakemake@input[0]" : No such file or directory
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Troy Comi    4 年前

    您需要使用bash语法获取输入参数, snakemake@input[0] 专门用于使用 script 指令。

    特别是,您可以更换 snakemake@input[0] 具有 $1 ,它获取bash脚本的第一个参数 snakemake@output[0] 具有 $2 ,第二个论点。为了安全起见,请用双引号将其括起来,以防文件名中有空格,例如。 "$1"

    推荐文章