【问题标题】:Gensub inside a shell command in SnakemakeSnakemake 中的 shell 命令中的 Gensub
【发布时间】:2020-07-09 15:01:17
【问题描述】:
# 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 $1, gensub( ".*/", "", $2 )}}' | 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 $1, gensub( .*/, , $2 )}
awk: ligne de commande:1:                    ^ syntax error
awk: ligne de commande:1: {print $1, gensub( .*/, , $2 )}

显然我的 gensub 语法是错误的
在添加 gensub 命令之前,我的 2 个规则中的 2 个 shell 命令是:

"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print $1}}' | 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 imrb@{server_san} "echo 7 | awk '{print \$1, gensub( ".*/", "", \$2 )}'" 或类似的工作,然后担心将其包含在更大的脚本中。我假设您有某些理由将完整脚本中的每个 {} 加倍。
  • 如果我不尝试将它包含在我的 Snakemake 中,它就可以工作。在 Snakemake 中,shell 命令中的{} 用于引用规则的元素(输入、输出...)或通配符。如果您希望 Snakemake 将其理解为外壳字符,则必须加倍 {

标签: python awk snakemake md5sum


【解决方案1】:

你有双引号包裹传递给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""" ... """

【讨论】:

  • 我有两条规则,第一条:shell 命令是本地的,第二条:shell 命令传递给 SSH。 shell 命令中的genesub 在本地或ssh 中都不起作用。您的语法不适用于带有 ssh 的规则,但它适用于第一个规则,但在 $2 之前没有反斜杠。这是第一条规则的解决方案:"""find {path_cluster}/{project_name} -type f -name "*.fastq.gz" -exec md5sum {{}} + | awk '{{print $1, gensub( \".*/\", \"\", $2 )}}' | sort > {output}""" 所以现在我仍然需要找到传递给 SSH 的命令的语法。
  • 你能解释一下'使用原始字符串'是什么意思吗?因为我必须使用通配符,所以我不能只在命令中写路径。
【解决方案2】:

感谢 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 $1, gensub( \".*/\", \"\", $2 )}}' | 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}"""

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多