如何 运行 snakemake 输入部分中的 AWK 脚本(以检索 snakemake 输入变量)?
How to run an AWK script within the input section of snakemake (in order to retrieve a snakemake input variable)?
我正在尝试构建用于分析 RNAseq 数据集的 snakemake 管道。一些数据集可能是 (1) 单端或双端,以及 (2) 数据集之间的搁浅也可能不同。我希望 snakemake 管道自动检测这 2 个变量并将其填充到 RSEM 输入中。
我想出了一个方法,使用来自 RSeQC 的 infer_experiment.py 输出文件“strandedness.txt”(注意前两行是空的)。
This is PairEnd Data Fraction of reads failed to determine: 0.0134
Fraction of reads explained by "1++,1--,2+-,2-+": 0.0049 Fraction of
reads explained by "1+-,1-+,2++,2--": 0.9817
现在我想使用 AWK,以便使用以下 AWK 代码从文件“strandedness.txt”中提取例如“PairEnd”,它在 bash 中运行良好:
awk 'FNR == 3 {print }' ./strandedness.txt
正确输出“PairEnd”
我把代码放在这个 AWK 脚本中 "pairend.awk":
#!/bin/awk -f
FNR == 3 {print }
如果我单独调用它,它工作正常:
./pairend.awk ./strandedness.txt
现在我想调用我的 snakemake 文件中的脚本,但我不知道该怎么做。 google 上的大多数示例在 shell 中使用 AWK 脚本,但我实际上想使用该脚本输出一个变量,该变量将用作我的 snakemake 管道的输入。我试过了,但无法正常工作:
DATASET,SAMPLE,FRR, =glob_wildcards(config["project_path"]+"resources/raw_datasets/{dataset}/{sample}_Homo_sapiens_RNA-Seq_{frr}.fastq.gz")
print(DATASET,SAMPLE,FRR)
rule all:
input:
expand(config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt",dataset=DATASET, sample=SAMPLE)
## Transcript quantification
rule RSEM_calculate_expression:
input:
fasta=config["project_path"]+"resources/Homo_sapiens.GRCh38.dna.primary_assembly.fa",
gtf=config["project_path"]+"resources/Homo_sapiens.GRCh38.106.gtf",
bam=config["project_path"]+"results/{dataset}/star_aligned_2pass/{sample}_Aligned.sortedByCoord.out.bam",
paired_end=config["project_path"]+"workflow/pairend.awk" config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
output:
gene_results=config["project_path"]+"results/{dataset}/RSEM/{sample}.genes.results",
isoform_results=config["project_path"]+"results/{dataset}/RSEM/{sample}.isoforms.results"
params:
index=config["project_path"]+"resources/starIndex/"
threads:
12
log:
config["project_path"]+"results/{dataset}/RSEM/{sample}.log"
shell:
"""
rsem-calculate-expression --star --num-threads {threads} {paired_end} --alignments {input.bam} {input.index} {wildcards.sample} {log}
"""
我也试过从 AWK 脚本调用 AWK 代码但没有成功:
Error: SyntaxError in line ... of snakefile: invalid syntax
我划线,但它指向 paired_end=config["project_path"]+"workflow/pairend.awk" config["project_path "]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
如何在 snakemake 的输入部分正确地 运行 my/an AWK 脚本(我对 运行 在 shell 部分中使用它不感兴趣。
任何帮助将不胜感激!
因为您要查找的是字符串而不是文件,所以应将其放入参数而不是输入。您也许可以使用 shell
函数从输入函数调用 awk,但我只在 run
指令中看到过它。
我认为最简单的选择是
- 将您的 awk 命令转换为 python 中的输入函数。
def get_pairend(wildcards, input):
# since your file is small, just read the whole thing. If it's larger don't read everything.
# get third line, third token
return open(input.paired_end).readlines()[2].split()[2]
rule RSEM_calculate_expression:
input:
...
paired_end=config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
...
params:
index=config["project_path"]+"resources/starIndex/",
paired_end=get_pairend,
shell:
"""
rsem-calculate-expression --star --num-threads {threads} {params.paired_end} --alignments {input.bam} {input.index} {wildcards.sample} {log}
"""
- 运行 awk 在你的 shell 指令中
rule RSEM_calculate_expression:
input:
...
paired_end=config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
shell:
"""
paired=$(awk 'FNR == 3 {{print }}' {input.paired_end})
rsem-calculate-expression --star --num-threads {threads} $paired --alignments {input.bam} {input.index} {wildcards.sample} {log}
"""
我更喜欢第一个选项。如果您决定做一些更复杂的事情并且您不需要额外的 awk 知识来理解您在做什么,那么修改起来会更容易。
我正在尝试构建用于分析 RNAseq 数据集的 snakemake 管道。一些数据集可能是 (1) 单端或双端,以及 (2) 数据集之间的搁浅也可能不同。我希望 snakemake 管道自动检测这 2 个变量并将其填充到 RSEM 输入中。
我想出了一个方法,使用来自 RSeQC 的 infer_experiment.py 输出文件“strandedness.txt”(注意前两行是空的)。
This is PairEnd Data Fraction of reads failed to determine: 0.0134 Fraction of reads explained by "1++,1--,2+-,2-+": 0.0049 Fraction of reads explained by "1+-,1-+,2++,2--": 0.9817
现在我想使用 AWK,以便使用以下 AWK 代码从文件“strandedness.txt”中提取例如“PairEnd”,它在 bash 中运行良好:
awk 'FNR == 3 {print }' ./strandedness.txt
正确输出“PairEnd”
我把代码放在这个 AWK 脚本中 "pairend.awk":
#!/bin/awk -f
FNR == 3 {print }
如果我单独调用它,它工作正常:
./pairend.awk ./strandedness.txt
现在我想调用我的 snakemake 文件中的脚本,但我不知道该怎么做。 google 上的大多数示例在 shell 中使用 AWK 脚本,但我实际上想使用该脚本输出一个变量,该变量将用作我的 snakemake 管道的输入。我试过了,但无法正常工作:
DATASET,SAMPLE,FRR, =glob_wildcards(config["project_path"]+"resources/raw_datasets/{dataset}/{sample}_Homo_sapiens_RNA-Seq_{frr}.fastq.gz")
print(DATASET,SAMPLE,FRR)
rule all:
input:
expand(config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt",dataset=DATASET, sample=SAMPLE)
## Transcript quantification
rule RSEM_calculate_expression:
input:
fasta=config["project_path"]+"resources/Homo_sapiens.GRCh38.dna.primary_assembly.fa",
gtf=config["project_path"]+"resources/Homo_sapiens.GRCh38.106.gtf",
bam=config["project_path"]+"results/{dataset}/star_aligned_2pass/{sample}_Aligned.sortedByCoord.out.bam",
paired_end=config["project_path"]+"workflow/pairend.awk" config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
output:
gene_results=config["project_path"]+"results/{dataset}/RSEM/{sample}.genes.results",
isoform_results=config["project_path"]+"results/{dataset}/RSEM/{sample}.isoforms.results"
params:
index=config["project_path"]+"resources/starIndex/"
threads:
12
log:
config["project_path"]+"results/{dataset}/RSEM/{sample}.log"
shell:
"""
rsem-calculate-expression --star --num-threads {threads} {paired_end} --alignments {input.bam} {input.index} {wildcards.sample} {log}
"""
我也试过从 AWK 脚本调用 AWK 代码但没有成功:
Error: SyntaxError in line ... of snakefile: invalid syntax
我划线,但它指向 paired_end=config["project_path"]+"workflow/pairend.awk" config["project_path "]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
如何在 snakemake 的输入部分正确地 运行 my/an AWK 脚本(我对 运行 在 shell 部分中使用它不感兴趣。 任何帮助将不胜感激!
因为您要查找的是字符串而不是文件,所以应将其放入参数而不是输入。您也许可以使用 shell
函数从输入函数调用 awk,但我只在 run
指令中看到过它。
我认为最简单的选择是
- 将您的 awk 命令转换为 python 中的输入函数。
def get_pairend(wildcards, input):
# since your file is small, just read the whole thing. If it's larger don't read everything.
# get third line, third token
return open(input.paired_end).readlines()[2].split()[2]
rule RSEM_calculate_expression:
input:
...
paired_end=config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
...
params:
index=config["project_path"]+"resources/starIndex/",
paired_end=get_pairend,
shell:
"""
rsem-calculate-expression --star --num-threads {threads} {params.paired_end} --alignments {input.bam} {input.index} {wildcards.sample} {log}
"""
- 运行 awk 在你的 shell 指令中
rule RSEM_calculate_expression:
input:
...
paired_end=config["project_path"]+"results/{dataset}/RSEM/{sample}_strandedness.txt"
shell:
"""
paired=$(awk 'FNR == 3 {{print }}' {input.paired_end})
rsem-calculate-expression --star --num-threads {threads} $paired --alignments {input.bam} {input.index} {wildcards.sample} {log}
"""
我更喜欢第一个选项。如果您决定做一些更复杂的事情并且您不需要额外的 awk 知识来理解您在做什么,那么修改起来会更容易。