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

Posted

技术标签:

【中文标题】为啥 Nextflow 不能处理这个 awk 短语?【英文标题】: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 'BEGINFS=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 'BEGINFS=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)) 

【问题讨论】:

【参考方案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

【讨论】:

谢谢!您完全正确,应该自己运行简化版本,而不是假设这是问题所在。

以上是关于为啥 Nextflow 不能处理这个 awk 短语?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在单个 nextflow 过程中对输入进行输出反馈?

sh 有用的nextflow bash函数

text 导入文件名实用程序nextflow groovy grape

为啥“docker”不能删镜像?

为啥 SERIAL 不能在 Postgres 中处理这个简单的表?

为啥Java里的Arrays.asList不能用add和remove方法