1

主题:寻找一种好的输出格式来使用从 Nextflow 的新脚本/进程中的文件中提取的值

我似乎无法弄清楚这一点:

我正在 Nextflow 中编写一些进程,其中我从 txt.file (PROCESS1) 中提取一个值,并且我想在第二个进程 (PROCESS2) 中使用它。值的提取没有问题,但找到合适的输出格式是。问题是,当我将标准输出(OPTION1)保存到频道时,似乎附加了某种“/n”,这在我的第二个脚本中产生了问题。

或者,因为这不起作用,我想将 PROCESS1 的输出保存为文件(OPTION2)。这也没有问题,但我找不到在 PROCESS2 中读取文件内容的正确方法。我怀疑它与“getText()”有关,但我尝试了几件事,但都失败了。

最后我想尝试将输出保存为变量(OPTION3),但我不知道该怎么做。

过程1

process txid {
    publishDir "$wanteddir", mode:'copy', overwrite: true

    input:
    file(report) from report4txid

    output:
    stdout into txid4assembly           //OPTION 1
    file(txid.txt) into txid4assembly   //OPTION 2
    val(txid) into txid4assembly        //OPTION 3: doesn't work


    shell:
    '''
    column -s, -t < !{report}| awk '$4 == "S"'| head -n 1 | cut -f5            //OPTION1
    column -s, -t < !{report}| awk '$4 == "S"'| head -n 1 | cut -f5 > txid.txt //OPTION2
    column -s, -t < !{report}| awk '$4 == "S"'| head -n 1 | cut -f5 > txid     //OPTION3

    '''
}

过程2

process accessions {
    publishDir "$wanteddir", mode:'copy', overwrite: true

    input:
    val(txid) from txid4assembly       //OPTION1 & OPTION3
    file(txid) from txid4assembly      //OPTION2

    output:
    file("${txid}accessions.txt") into accessionlist

    script:
    """
    esearch -db assembly -query '${txid}[txid] AND "complete genome"[filter] AND "latest refseq"[filter]' \
    | esummary | xtract -pattern DocumentSummary -element AssemblyAccession > ${txid}accessions.txt
    """
}

选项 1 后的过程 2 脚本(备注:输出 = 573,布局未更改)

esearch -db assembly -query '573
  [txid] AND "complete genome"[filter] AND "latest refseq"[filter]'     | esummary | xtract -pattern DocumentSummary -element AssemblyAccession > 573
  accessions.txt

谢谢您的帮助!

4

2 回答 2

0

正如您所发现的,您的命令行会写入一个尾随换行符。您可以尝试以某种方式删除它,可能通过管道传递到另一个命令,或者(更好)通过重构以正确解析您的报告文件。下面是一个使用打印第五列而没有尾随换行符的示例。这对于简单的 CSV 报告文件可能工作得很好,但是 AWK 的 CSV 解析能力是有限的。因此,如果您的报告可能包含引用字段等,请考虑使用在其标准库中提供 CSV 解析的语言(例如 Python 和csv库,或 Perl 和Text::CSV模块)。Nextflow 使您可以轻松使用您喜欢的脚本语言

process txid {
    publishDir "$wanteddir", mode:'copy', overwrite: true

    input:
    file(report) from report4txid

    output:
    stdout into txid4assembly

    shell:
    '''
    awk -F, '$4 == "S" { printf("%s", $5); exit }' "!{report}"
    '''

如果您的文件在第四列中包含“S”并且第五列具有字符串长度 >= 1 的某个值,这将为您提供一个可以在“加入”过程中使用的值。但请注意,这不会处理文件中第四列永远不等于“S”的情况。它也不会处理您的第五列可能是空值(字符串长度 == 0)的情况。在这些情况下,“stdout”将为空,因此您将在输出通道中获得一个空值。您可能需要添加一些代码以确保以某种方式处理这些边缘情况。

于 2020-04-12T14:26:32.667 回答
0

我最终通过添加以下代码来修复它,它只从我的输出中获取数字

... | tr -dc '0-9'

于 2020-04-15T13:28:43.610 回答