【问题标题】:Why can't Nextflow handle this awk phrase?为什么 Nextflow 不能处理这个 awk 短语?
【发布时间】:2022-01-24 00:26:35
【问题描述】:

背景: 使用 csv 作为输入,我想将前两列组合成一个新列(用下划线分隔)并将新列添加到新 csv 的末尾。

输入:

column1,column2,column3
1,2,3
a,b,c

期望的输出:

column1,column2,column3,column1_column2
1,2,3,1_2
a,b,c,a_b

以下 awk 短语可在命令行中使用:

awk 'BEGIN{FS=OFS=","} {print \$0, (NR>1 ? \$1"_"\$2 : "column1_column2")}' file.csv > full_template.csv

但是,当放置在 nextflow 脚本(如下)中时,它会出错。

#!/usr/bin/env nextflow

params.input = '/file/location/here/file.csv'

process unique {
    input:
    path input from params.input

    output:
    path 'full_template.csv' into template

    """
    awk 'BEGIN{FS=OFS=","} {print \$0, (NR>1 ? \$1"_"\$2 : "combined_header")}' $input > full_template.csv
    """
}

这是错误:

N E X T F L O W  ~  version 21.10.0
Launching `file.nf` [awesome_pike] - revision: 1b63d4b438
class groovyx.gpars.dataflow.expression.DataflowInvocationExpression cannot be cast to class java.nio.file.FileSystem (groovyx.gpars.dataflow.expression.Dclass groovyx.gpars.dataflow.expression.DataflowInvocationExpression cannot be cast to class java.nio.file.FileSystem (groovyx.gpars.dataflow.expression.DataflowInvocationExpression is in unnamed module of loader 'app'; java.nio.file.FileSystem is in module java.base of loader 'bootstrap')

我不确定是什么原因造成的,我们将不胜感激。

谢谢!

编辑:

是的,这似乎不是错误的根源(对不起!)。我正在尝试在生成的 csv 上使用 splitCsv,这似乎是导致错误的原因。像这样:

Channel
    .fromPath(template)
    .splitCsv(header:true, sep:',')
    .map{ row -> tuple(row.column1, file(row.column2), file(row.column3)) }
    .set { split }

我希望我的问题是在频道上使用 .fromPath 是不可接受的,但我不知道该怎么做。


编辑 2:

所以这是一个愚蠢的错误。我只需要在调用通道的输入行之后直接添加 .splitCsv 选项。算不上优雅,但现在看起来效果很好。

process blah {

    input:
    what_you_want from template.splitCsv(header:true, sep:',').map{ row -> tuple(row.column1, file(row.column2), file(row.column3)) }

【问题讨论】:

    标签: java awk groovy nextflow


    【解决方案1】:

    我无法重现您在示例代码和 Nextflow 版本中看到的错误。事实上,我得到了预期的输出。不过,这应该不足为奇,因为您已经正确地转义了 AWK 命令中的特殊美元变量。错误的原因可能在您的代码中的其他地方。

    如果转义特殊字符变得乏味,另一种方法是改用shell 块:

    它是脚本定义的替代方案,具有重要意义 区别,它使用感叹号! 字符作为变量 Nextflow 变量的占位符代替通常的美元 字符。

    例子变成:

    params.input_csv = '/file/location/here/file.csv'
    
    input_csv = file( params.input_csv)
    
    
    process unique {
    
        input:
        path input_csv
    
        output:
        path 'full_template.csv' into template
    
        shell:
        '''
        awk 'BEGIN { FS=OFS="," } { print $0, (NR>1 ? $1 "_" $2 : "combined_header") }' \\
        "!{input_csv}" > "full_template.csv"
        '''
    }
    
    template.view { it.text }
    

    结果:

    $ nextflow run file.nf 
    N E X T F L O W  ~  version 20.10.0
    Launching `file.nf` [wise_hamilton] - revision: b71ff1eb03
    executor >  local (1)
    [76/ddbb87] process > unique [100%] 1 of 1 ✔
    column1,column2,column3,combined_header
    1,2,3,1_2
    a,b,c,a_b
    

    【讨论】:

    • 谢谢!您完全正确,应该自己运行简化版本,而不是假设这是问题所在。
    猜你喜欢
    • 2013-09-11
    • 2011-09-24
    • 2017-04-04
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多