Snakemake интегрирует несколько командных строк в правило

Вывод моей первой командной строки "bcftools query -l {input.invcf} | head -n 1"печатает имя первого индивидуума файла vcf (т.е. IND1). Я хочу использовать этот вывод в selectvariants GATKв -sn IND1вариант. Как можно интегрировать 1-ю командную строку в змейку, чтобы использовать ее вывод в следующей?

      rule selectvar:
    input:
        invcf="{family}_my.vcf"
    params:
        ind= ???
        ref="ref.fasta"
    output:
        out="{family}.dn.vcf"
    shell:
        """
        bcftools query -l {input.invcf} | head -n 1 > {params.ind}
        gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn {params.ind} -O {output.out}
        """

3 ответа

Есть несколько вариантов, но самый простой — сохранить результаты во временную переменную bash:

      rule selectvar:
   ...
   shell:
        """
        myparam=$(bcftools query -l {input.invcf} | head -n 1)
        gatk -sn "$myparam" ...
        """

Как отметил @dariober, если изменить pipefailповедение, могут быть неожиданные результаты, см . пример в этом ответе .

Когда мне приходится делать эти вещи, я предпочитаю использовать run вместо shell, а затем только в конце. Причина этого в том, что это позволяет змеемейкеру анализировать оператор запуска и досрочно завершать работу, если что-то пойдет не так, вместо того, чтобы выполнять неработающую команду оболочки.

      rule selectvar:
    input:
        invcf="{family}_my.vcf"
    params:
        ref="ref.fasta"
        gatk_opts='--java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants'
    output:
        out="{family}.dn.vcf"
    run:
        opts = "{params.gatk_opts} -R {params.ref} -V {input.invcf} -O {output.out}"
        sn_parameter = shell("bcftools query -l {input.invcf} | head -n 1")
        # we could add a sanity check here if necessary, before shelling out
        shell(f"gatk {options} {sn_parameter}")
        """

Я думаю, что нашел решение:

      rule selectvar:
    input:
        invcf="{family}_my.vcf"
    params:
        ref="ref.fasta"
    output:
        out="{family}.dn.vcf"
    shell:
        """
        gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn `bcftools query -l {input.invcf} | head -n 1` -O {output.out}
        """
Другие вопросы по тегам