为啥 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 过程中对输入进行输出反馈?
text 导入文件名实用程序nextflow groovy grape