将进程脚本中生成的文件内容保存到 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 > $FOOFOO=``cat result_bam.txt` 可能是一个解决方案,但我不知道如何正确保存它以便变量在进程之间可用。

使用 env channelFOO=``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
"""

希望这对遇到相同问题或类似问题的任何人有所帮助!