如何解决如何从在snakemake中不共享命名约定的单个输入文件生成多个输出文件?
我已经搜索了一段时间,this 线程是我得到的最接近的线程,但无法使用我的设置。
我想做什么:
我有一个文本文件,其中每一行都有一个 ID 和一个数据点
1234 data2
5678 data3
...
我想收集我的配置文件中与某些 ID 相对应的行,并将它们写入根据 ID 值(1234 或 5678)命名的自己的文件中
# config.yaml
IDs:
ID1: 1234
ID2: 5678
当我在没有使用 snakemake 的情况下执行此操作时,我只是遍历了 bash 脚本中的 ID 列表并为它们搜索了文本文件,但是我无法使用 snakemake 完成此操作。
我在目标中的通配符有问题,或者我的扩展函数将所有 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}'
解决方法
首先,我猜你所说的“扬声器”不是字典的值,而是关键。所以你rule all
应该像这样展开:
rule all:
input:
expand("{speaker}",speaker=speakers)
接下来,这条规则的字面意思是:“我需要两个文件名分别为 1
和 2
的文件。”但是没有规则可以生成具有这些名称的文件。你有:
rule select_speaker_files:
output:
speaker="{speaker}_wav-list"
第三条规则声称:“我可以生成名称以 _wav-list
结尾的文件。”绝对没有可能产生管道需要创建的东西的规则。你的意思可能是:
rule all:
input:
expand("{speaker}_wav-list",speaker=speakers)
在这种情况下,规则至少是一致的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。