Snakemake 中 shell 命令中的 Gensub
Gensub inside a shell command in Snakemake
# md5sum on fastq folder on cluster
rule md5sum_fastq_cluster:
input:
path_cluster+'/'+project_name+'/'+project_name+'.csv'
output:
path_cluster+'/'+project_name+'/'+'md5sum.txt'
shell:
"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print , gensub( ".*/", "", )}}' | sort > {output}"""
# md5sum on fastq folder on remote server
rule md5sum_fastq_SAN:
input:
copyFASTQdone
output:
SFTPsan.remote(server_san+path_san+'/'+project_name+'/md5sum.txt')
shell:
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1, gensub( ".*/", "", $2 )}}' | sort" > {output}"""
--------------------------------------------------------------------------
awk: ligne de commande:1: {print , gensub( .*/, , )}
awk: ligne de commande:1: ^ syntax error
awk: ligne de commande:1: {print , gensub( .*/, , )}
显然我的 gensub 语法是错误的
在添加 gensub 命令之前,我来自 2 条规则的 2 shell 命令是:
"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print }}' | sort > {output}"""
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1}}' | sort > {output}"""
它正在工作。只是加了gensub之后,找不到正确的语法。
我需要这个 gensub 基本上做与 basename
相同的事情来删除我的文件的路径。
当然,我在我的 snakemake 之外尝试了 awk/gensub 命令,它有效。
以防万一,以下是我的规则生成的文件:
# md5sum.txt before gensub
01afd3f2bf06d18c5609b2c2c963eddf /data/imrb/Data/200122_GSC/14-CTRL50TMZ1907192_S11_R2_001.fastq.gz
03e353c316aef09c748aa2363db95599 /data/imrb/Data/200122_GSC/15-11650TMZ1907192_S12_R2_001.fastq.gz
1ba21b8be882bcb62c464ba515800ca4 /data/imrb/Data/200122_GSC/1-CTRL120719_S1_R2_001.fastq.gz
# md5sum.txt after gensub
01afd3f2bf06d18c5609b2c2c963eddf 14-CTRL50TMZ1907192_S11_R2_001.fastq.gz
03e353c316aef09c748aa2363db95599 15-11650TMZ1907192_S12_R2_001.fastq.gz
1ba21b8be882bcb62c464ba515800ca4 1-CTRL120719_S1_R2_001.fastq.gz
您用双引号将传递给 ssh
的命令括起来(下面用 ^
标记),因此您需要转义 awk
中的双引号。这可能有效:
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1, gensub( \".*/\", \"\", $2 )}}' | sort" > {output}"""
____^____ ___^___
(我还建议对 shell 命令使用原始字符串以防止元字符的解释,即使用 r""" ... """
)
感谢 dariober,我为每条规则找到了正确的语法。
对于第一条规则:我需要转义我在 awk
中使用的双引号
rule md5sum_fastq_cluster:
input:
path_cluster+'/'+project_name+'/'+project_name+'.csv'
output:
path_cluster+'/'+project_name+'/'+'md5sum.txt'
shell:
"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print , gensub( \".*/\", \"\", )}}' | sort > {output}"""
第二条规则,shell命令传给SSH,我需要双转义我的双引号,在$2前加一个\
rule md5sum_fastq_SAN:
input:
copyFASTQdone
output:
SFTPsan.remote(server_san+path_san+'/'+project_name+'/md5sum.txt')
shell:
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1, gensub( \".*/\", \"\", $2 )}}' | sort" > {output}"""
# md5sum on fastq folder on cluster
rule md5sum_fastq_cluster:
input:
path_cluster+'/'+project_name+'/'+project_name+'.csv'
output:
path_cluster+'/'+project_name+'/'+'md5sum.txt'
shell:
"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print , gensub( ".*/", "", )}}' | sort > {output}"""
# md5sum on fastq folder on remote server
rule md5sum_fastq_SAN:
input:
copyFASTQdone
output:
SFTPsan.remote(server_san+path_san+'/'+project_name+'/md5sum.txt')
shell:
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1, gensub( ".*/", "", $2 )}}' | sort" > {output}"""
--------------------------------------------------------------------------
awk: ligne de commande:1: {print , gensub( .*/, , )}
awk: ligne de commande:1: ^ syntax error
awk: ligne de commande:1: {print , gensub( .*/, , )}
显然我的 gensub 语法是错误的
在添加 gensub 命令之前,我来自 2 条规则的 2 shell 命令是:
"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print }}' | sort > {output}"""
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1}}' | sort > {output}"""
它正在工作。只是加了gensub之后,找不到正确的语法。
我需要这个 gensub 基本上做与 basename
相同的事情来删除我的文件的路径。
当然,我在我的 snakemake 之外尝试了 awk/gensub 命令,它有效。
以防万一,以下是我的规则生成的文件:
# md5sum.txt before gensub
01afd3f2bf06d18c5609b2c2c963eddf /data/imrb/Data/200122_GSC/14-CTRL50TMZ1907192_S11_R2_001.fastq.gz
03e353c316aef09c748aa2363db95599 /data/imrb/Data/200122_GSC/15-11650TMZ1907192_S12_R2_001.fastq.gz
1ba21b8be882bcb62c464ba515800ca4 /data/imrb/Data/200122_GSC/1-CTRL120719_S1_R2_001.fastq.gz
# md5sum.txt after gensub
01afd3f2bf06d18c5609b2c2c963eddf 14-CTRL50TMZ1907192_S11_R2_001.fastq.gz
03e353c316aef09c748aa2363db95599 15-11650TMZ1907192_S12_R2_001.fastq.gz
1ba21b8be882bcb62c464ba515800ca4 1-CTRL120719_S1_R2_001.fastq.gz
您用双引号将传递给 ssh
的命令括起来(下面用 ^
标记),因此您需要转义 awk
中的双引号。这可能有效:
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1, gensub( \".*/\", \"\", $2 )}}' | sort" > {output}"""
____^____ ___^___
(我还建议对 shell 命令使用原始字符串以防止元字符的解释,即使用 r""" ... """
)
感谢 dariober,我为每条规则找到了正确的语法。
对于第一条规则:我需要转义我在 awk
中使用的双引号rule md5sum_fastq_cluster:
input:
path_cluster+'/'+project_name+'/'+project_name+'.csv'
output:
path_cluster+'/'+project_name+'/'+'md5sum.txt'
shell:
"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print , gensub( \".*/\", \"\", )}}' | sort > {output}"""
第二条规则,shell命令传给SSH,我需要双转义我的双引号,在$2前加一个\
rule md5sum_fastq_SAN:
input:
copyFASTQdone
output:
SFTPsan.remote(server_san+path_san+'/'+project_name+'/md5sum.txt')
shell:
"""ssh imrb@{server_san} "find {path_san}/{project_name} -type f -name '*.fastq.gz' -exec md5sum {{}} + | awk '{{print $1, gensub( \".*/\", \"\", $2 )}}' | sort" > {output}"""