Ошибка имени при сбое ues в snakemake

#snakemake

#snakemake

Вопрос:

Во-первых, вот тестовый пример (Snakefile):

 rule test:
    input:"path/file1", "path/file2"
    output:"path/file3"
    shell:
        """
        awk 'NR==FNR{score[$3]=$5;next}{{sum=0}for(i=$2;i<=$3;i  ){sum =score[i]}printf "%-10s\t%-10s\n",sum,$4}' {input[0]} {input[1]} >> {output}
        """
  

Когда я запускаю этот скрипт, он возвращает NameError: The name 'score' is unknown in this context. Please make sure that you defined that variable. Also note that braces not used for variable access have to be escaped by repeating them, i.e. {{print $1}} , я пытался {score} или replicate {}, но все не работает. Итак, я хочу знать, как решить эту проблему. Спасибо.

Ответ №1:

Это потому, что snakemake пытается отформатировать текст и поместить переменные в строку. Поскольку, например, score являются частью скрипта, snakemake не может определить, к какой переменной он принадлежит, и происходит сбой. Чтобы избежать этого поведения, используйте двойные фигурные скобки : {{score[$3]}} . Это становится довольно уродливым с несколькими фигурными скобками, как в вашем правиле

 rule test:
    input:"path/file1", "path/file2"
    output:"path/file3"
    shell:
        """
        awk 'NR==FNR{{score[$3]=$5;next}}{{{{sum=0}}for(i=$2;i<=$3;i  ){{sum =score[i]}}printf "%-10s\t%-10s\n",sum,$4}}' {input[0]} {input[1]} >> {output}
        """
  

(Надеюсь, я ничего не пропустил, но я думаю, вы поняли идею)

Комментарии:

1. Скрипт работает правильно по вашему совету, спасибо за вашу помощь.