Nextflow:向元组添加唯一 ID、哈希或行号
Nextflow: add unique ID, hash, or row number to tuple
ch_files = Channel.fromPath("myfiles/*.csv")
ch_parameters = Channel.from(['A','B, 'C', 'D'])
ch_samplesize = Channel.from([4, 16, 128])
process makeGrid {
input:
path input_file from ch_files
each parameter from ch_parameters
each samplesize from ch_samplesize
output:
tuple path(input_file), parameter, samplesize, path("config_file.ini") into settings_grid
"""
echo "parameter=$parameter;sampleSize=$samplesize" > config_file.ini
"""
}
给我一个 number_of_files * 4 * 3 的设置文件网格,这样我就可以 运行 为每个参数和输入文件的组合编写一些脚本。
如何向该网格的每一行添加一些 ID?行 ID 就可以了,但我什至更喜欢一些没有“含义”的唯一 6 位字母数字代码,因为 table 中的顺序无关紧要。我可以提取出工作文件夹的最后一部分,每个进程似乎都是独一无二的;但我认为依赖 sed
和 $PWD
并不理想,而且我没有看到它作为 运行 时间元数据变量提供程序提供。 (加上它有点长但还可以)。在以前的设置中,我有一个来自 LSF 集群系统的作业 ID,但我希望它是 portable.
不能保证每个组合都是唯一的(例如在输入通道中有两次参数'A'
应该是有效的)。
明确地说,我想要这个输出
file1.csv A 4 pathto/config.ini 1ac5r
file1.csv A 16 pathto/config.ini 7zfge
file1.csv A 128 pathto/config.ini ztgg4
file2.csv A 4 pathto/config.ini 123js
等等
给定输入声明,它使用 each
限定符作为 input repeater, it will be difficult to append some unique id to the grid without some refactoring to use either the combine or cross 运算符。如果输入只是文件或简单值(如在您的示例代码中),重构就没有多大意义。
要获得唯一代码,简单的选项是:
正如您提到的,不幸的是,如果不进行一些破解来解析 $PWD
,就无法访问唯一的任务哈希。虽然,可能可以使用 BASH 参数替换来避免 sed/awk/cut(假设 BASH 是你的 shell 当然......)你可以尝试使用:"${PWD##*/}"
您可能更喜欢使用 ${task.index}
,它是同一任务中的唯一索引。虽然不能保证任务索引在执行过程中是唯一的,但在大多数情况下应该足够了。也可以格式化为例如:
process example {
...
script:
def idx = String.format("%06d", task.index)
"""
echo "${idx}"
"""
}
- 或者,创建您自己的 UUID。您也许可以使用前 N 个字符,但这当然会降低 ID 唯一的可能性(无论如何都不能保证)。尽管对于一小部分有限的输入,这可能并不重要:
process example {
...
script:
def uuid = UUID.randomUUID().toString()
"""
echo "${uuid}"
echo "${uuid.take(6)}"
echo "${uuid.takeBefore('-')}"
"""
}
ch_files = Channel.fromPath("myfiles/*.csv")
ch_parameters = Channel.from(['A','B, 'C', 'D'])
ch_samplesize = Channel.from([4, 16, 128])
process makeGrid {
input:
path input_file from ch_files
each parameter from ch_parameters
each samplesize from ch_samplesize
output:
tuple path(input_file), parameter, samplesize, path("config_file.ini") into settings_grid
"""
echo "parameter=$parameter;sampleSize=$samplesize" > config_file.ini
"""
}
给我一个 number_of_files * 4 * 3 的设置文件网格,这样我就可以 运行 为每个参数和输入文件的组合编写一些脚本。
如何向该网格的每一行添加一些 ID?行 ID 就可以了,但我什至更喜欢一些没有“含义”的唯一 6 位字母数字代码,因为 table 中的顺序无关紧要。我可以提取出工作文件夹的最后一部分,每个进程似乎都是独一无二的;但我认为依赖 sed
和 $PWD
并不理想,而且我没有看到它作为 运行 时间元数据变量提供程序提供。 (加上它有点长但还可以)。在以前的设置中,我有一个来自 LSF 集群系统的作业 ID,但我希望它是 portable.
不能保证每个组合都是唯一的(例如在输入通道中有两次参数'A'
应该是有效的)。
明确地说,我想要这个输出
file1.csv A 4 pathto/config.ini 1ac5r
file1.csv A 16 pathto/config.ini 7zfge
file1.csv A 128 pathto/config.ini ztgg4
file2.csv A 4 pathto/config.ini 123js
等等
给定输入声明,它使用 each
限定符作为 input repeater, it will be difficult to append some unique id to the grid without some refactoring to use either the combine or cross 运算符。如果输入只是文件或简单值(如在您的示例代码中),重构就没有多大意义。
要获得唯一代码,简单的选项是:
正如您提到的,不幸的是,如果不进行一些破解来解析
$PWD
,就无法访问唯一的任务哈希。虽然,可能可以使用 BASH 参数替换来避免 sed/awk/cut(假设 BASH 是你的 shell 当然......)你可以尝试使用:"${PWD##*/}"
您可能更喜欢使用
${task.index}
,它是同一任务中的唯一索引。虽然不能保证任务索引在执行过程中是唯一的,但在大多数情况下应该足够了。也可以格式化为例如:
process example {
...
script:
def idx = String.format("%06d", task.index)
"""
echo "${idx}"
"""
}
- 或者,创建您自己的 UUID。您也许可以使用前 N 个字符,但这当然会降低 ID 唯一的可能性(无论如何都不能保证)。尽管对于一小部分有限的输入,这可能并不重要:
process example {
...
script:
def uuid = UUID.randomUUID().toString()
"""
echo "${uuid}"
echo "${uuid.take(6)}"
echo "${uuid.takeBefore('-')}"
"""
}