【问题标题】:How to generate multiple output files from single input file that does not share naming convention in snakemake?如何从在snakemake中不共享命名约定的单个输入文件生成多个输出文件?
【发布时间】:2021-07-21 08:39:58
【问题描述】:

我已经搜索了一段时间,this 线程是我得到的最接近的线程,但无法使用我的设置。

我想做什么:

我有一个文本文件,其中每一行都有一个 ID 和一个数据点

1234 data2
5678 data3
...

我想收集与我的配置文件中的某些 ID 对应的行,并将它们写入根据 ID 值(1234 或 5678)命名的自己的文件中

# config.yaml
IDs:
    ID1: 1234
    ID2: 5678

当我在不使用snakemake 的情况下执行此操作时,我只是在我的bash 脚本中循环遍历ID 列表并为它们获取文本文件,但我无法使用snakemake 完成此操作。

要么我的目标中的通配符有问题,要么我的 expand 函数将所有 ID 提供给 shell 中的 grep 命令,或者当遵循已接受的链接答案时,我得到“缺少规则所有的输入文件:And_Laa A_log”我可以分享我现在拥有的东西,但我认为这样做的正确方法与我拥有的东西相去甚远,它只会让所有人感到困惑:

configfile: "config.yaml"

# Trying to replicate stackoverflow answer
speakers = {
  "1": "And_Laa",
  "2": "A_log"
}

def get_speaker(wildcards):
#  return expand("{speaker}", speaker=config["speakers"]) 
  return speakers[wildcards.speaker]

rule all:
  input:
#    expand("{speaker}_wav-list", speaker=config[speakers])
    expand("{speaker}", speaker=speakers.values())

# Selecting all the audiofiles for the speakers from a very large file
rule select_speaker_files:
  input:
    wav=config["files"]["wavs"]
  output:
    speaker="{speaker}_wav-list"
  params:
    speaker=get_speaker,
  shell:
    'grep "{params.speaker}" {input.wav} > {output.speaker}'

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    首先,我猜你所说的“演讲者”不是字典的值,而是关键。所以你 rule all 应该像这样扩展:

    rule all:
      input:
        expand("{speaker}", speaker=speakers)
    

    接下来,这条规则的字面意思是:“我需要两个文件名分别为 12。”但是没有规则可以生成具有这些名称的文件。你有:

    rule select_speaker_files:
      output:
        speaker="{speaker}_wav-list"
    

    第三条规则声称:“我可以生成一个名称以 _wav-list 结尾的文件。”绝对没有规则可以产生管道需要创建的东西。你的意思可能是:

    rule all:
      input:
        expand("{speaker}_wav-list", speaker=speakers)
    

    在这种情况下,规则至少是一致的。

    【讨论】:

    • 谢谢!我确实想要该值,并且该值位于 grep 命令和输出文件中。所以我将 Snakefile 修改为这个,它似乎可以工作,但我认为必须有另一种方法将通配符赋予 shell 命令def get_speaker(wildcards): return wildcards rule all: input: expand("{speaker}_wav-list", speaker=speakers.values()) params: get_speaker, shell: 'grep "{params}" {input.wav} > {output.speaker}'
    • 如果函数get_speaker只是字面地返回参数,为什么在这种情况下还需要函数?
    • 你说得对,我不知道。我只是不知道如何访问 shell 中的通配符,但显然 grep "{wildcards.speaker}" 做到了。我之前只用 {wildcards} 和其他一些方法尝试过,但没有奏效。
    • shell 部分访问通配符的最佳(和推荐)方法是使用其名称:grep "{speaker}"
    • 所以我现在扩展了我的脚本,它似乎运行良好。但是,如果我尝试仅使用 {speaker} 而不是 {wildcards.speaker} 我会得到 NameError: The name 'speaker' 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}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多