我有一个简单的功能,可以读取一个文件(一行)并在拆分后获取第一个元素。
def get_wc(wc):
file = open(wc,"r")
normalization_value = file.readline().split(' ')[0]
return(normalization_value)
我在snakemake规则中使用此功能。
rule compute_fc:
input:
"data/annotated_clones/{cdna}_paste_{lib}.annotated.bed"
output:
"data/fold_change/{cdna}_paste_{lib}.fc.bed"
params:
size_cdna=get_wc("data/wc_bed/cdna/{cdna}.wc.txt"),
size_lib=get_wc("data/wc_bed/library/{lib}.wc.txt")
shell:'''
awk -v cdna1={params.size_cdna} -v inp={params.size_lib} -v addon=1 -v FS='\t' -v OFS='\t' '/^chr/{{ratio=(($7+addon)/($8+addon))*(inp/cdna1);print $0,ratio}}' {input} > {output}
'''
我正在尝试获取get_wc函数返回的值,并将其用作snakemake规则中的参数。
但是Snakemake不能使用通配符获取路径,因此它试图使用通配符获取路径,并且显然不起作用。
[Errno 2] No such file or directory: 'data/wc_bed/cdna/{cdna}.wc.txt'
我认为使用像这样的lambda函数应该可以工作:
params:
size_cdna = lambda wildcards: get_wc(f"data/wc_bed/cdna/{wildcards.cdna}.wc.txt")
size_lib = lambda wildcards: get_wc(f"data/wc_bed/library/{wildcards.lib}.wc.txt")
看一下文档的here。