为什么 Nextflow 不能处理这个 awk 短语?

Why can't Nextflow handle this awk phrase?

背景: 使用 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)) }

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

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

It is an alternative to the Script definition with an important difference, it uses the exclamation mark ! character as the variable placeholder for Nextflow variables in place of the usual dollar character.

示例变为:

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 [=10=], (NR>1 ?  "_"  : "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