将进程脚本中生成的文件内容保存到 Nextflow 变量中
Saving the contents of a file generated inside process script into Nextflow variable
我有一个使用 bash 脚本 (check_bam.sh
) 生成文本文件的 Nextflow 进程。该文本文件内容的唯一选项是 0 或任何其他数字。我想提取该 0 或其他值并将其保存到 Nextflow 变量中,以便能够使用条件,如果文件的内容为 0,则 Nextflow 脚本应跳过某些进程,并且如果是任何其他不为零的数字,则应完全执行。我在使用 Nextflow 条件和将通道设置为空时没有问题,但是在将脚本部分生成的值保存到 Nextflow 变量以使用外部进程的部分。
生成0或其他数字的文件(result_bam.txt
)的过程如下(我已经简化了,尽量清楚):
process CHECK_BAM {
input:
path bam from channel_bam
output:
path "result_bam.txt"
path "result_bam.txt" into channel_check_bam
script:
"""
bash bin/check_bam.sh $bam > result_bam.txt
"""
我正在检查的是 BAM 文件中映射读取的数量,我想将该数字保存到 Nextflow 变量中,因为如果该数字为零,则执行应跳过以下大部分过程,但是如果数字不为零,则表示文件中存在映射读取,执行应按预期继续。
我想也许使用 cat result_bam.txt > $FOO
或 FOO=``cat result_bam.txt
` 可能是一个解决方案,但我不知道如何正确保存它以便变量在进程之间可用。
使用 env channel 从 FOO=``cat result_bam.txt
中获取数据并将其转换为通道。
我几乎没有想到什么,希望我能很好地理解你的问题。 check_bam.sh
只计算 BAM 文件的行数吗?
我的第一个选择是检查您是否有可能检查 BAM 文件是否包含您管道中的内容。这可能有用:countLines_documentation。在这里你应该小心,因为巨大的 BAM 文件会导致内存异常(countLines“加载”文件)。
第二种选择,也许更好,是将文件 result_bam.txt
传递到通道 channel_check_bam
,然后,以下过程应该是 运行 关于文件内容(文件中的数字 result_bam.txt
) 大于0。因此,当您将此通道连接到其他进程时,您应该读取内容为:
input:
val bam_lines from channel_check_bam.map{ it.readLines() } // Gives a list of lines, so 1st line will be your number of mapped reads.
when:
bam_lines[0].toInteger() > 0
只有当 result_bam.txt
中的数字 > 0 时,它才应该是 运行。
我正在使用 DSL2 对其进行测试,因此代码可能需要进行一些小的更改 - 但它有效。
Cris Tuñí - 编辑:2021 年 8 月 24 日
感谢 DawidGaceck 的帮助,只有当文件中的数字不为零时,我才能将我的进程编辑为 运行。我的代码结束时看起来像这样:
process CHECK_BAM {
input:
path bam from channel_bam
output:
path "result_bam.txt"
path "result_bam.txt" into channel_check_bam_process1,
channel_check_bam_process2
script:
"""
bash bin/check_bam.sh $bam > result_bam.txt
"""
process PROCESS1 {
input:
val bam_lines from channel_check_bam_process1.map{ it.readLines() }
when:
bam_lines[0].toInteger() > 0
script:
"""
foo bar baz
"""
希望这对遇到相同问题或类似问题的任何人有所帮助!
我有一个使用 bash 脚本 (check_bam.sh
) 生成文本文件的 Nextflow 进程。该文本文件内容的唯一选项是 0 或任何其他数字。我想提取该 0 或其他值并将其保存到 Nextflow 变量中,以便能够使用条件,如果文件的内容为 0,则 Nextflow 脚本应跳过某些进程,并且如果是任何其他不为零的数字,则应完全执行。我在使用 Nextflow 条件和将通道设置为空时没有问题,但是在将脚本部分生成的值保存到 Nextflow 变量以使用外部进程的部分。
生成0或其他数字的文件(result_bam.txt
)的过程如下(我已经简化了,尽量清楚):
process CHECK_BAM {
input:
path bam from channel_bam
output:
path "result_bam.txt"
path "result_bam.txt" into channel_check_bam
script:
"""
bash bin/check_bam.sh $bam > result_bam.txt
"""
我正在检查的是 BAM 文件中映射读取的数量,我想将该数字保存到 Nextflow 变量中,因为如果该数字为零,则执行应跳过以下大部分过程,但是如果数字不为零,则表示文件中存在映射读取,执行应按预期继续。
我想也许使用 cat result_bam.txt > $FOO
或 FOO=``cat result_bam.txt
` 可能是一个解决方案,但我不知道如何正确保存它以便变量在进程之间可用。
使用 env channel 从 FOO=``cat result_bam.txt
中获取数据并将其转换为通道。
我几乎没有想到什么,希望我能很好地理解你的问题。 check_bam.sh
只计算 BAM 文件的行数吗?
我的第一个选择是检查您是否有可能检查 BAM 文件是否包含您管道中的内容。这可能有用:countLines_documentation。在这里你应该小心,因为巨大的 BAM 文件会导致内存异常(countLines“加载”文件)。
第二种选择,也许更好,是将文件 result_bam.txt
传递到通道 channel_check_bam
,然后,以下过程应该是 运行 关于文件内容(文件中的数字 result_bam.txt
) 大于0。因此,当您将此通道连接到其他进程时,您应该读取内容为:
input:
val bam_lines from channel_check_bam.map{ it.readLines() } // Gives a list of lines, so 1st line will be your number of mapped reads.
when:
bam_lines[0].toInteger() > 0
只有当 result_bam.txt
中的数字 > 0 时,它才应该是 运行。
我正在使用 DSL2 对其进行测试,因此代码可能需要进行一些小的更改 - 但它有效。
Cris Tuñí - 编辑:2021 年 8 月 24 日
感谢 DawidGaceck 的帮助,只有当文件中的数字不为零时,我才能将我的进程编辑为 运行。我的代码结束时看起来像这样:
process CHECK_BAM {
input:
path bam from channel_bam
output:
path "result_bam.txt"
path "result_bam.txt" into channel_check_bam_process1,
channel_check_bam_process2
script:
"""
bash bin/check_bam.sh $bam > result_bam.txt
"""
process PROCESS1 {
input:
val bam_lines from channel_check_bam_process1.map{ it.readLines() }
when:
bam_lines[0].toInteger() > 0
script:
"""
foo bar baz
"""
希望这对遇到相同问题或类似问题的任何人有所帮助!