Ищете хороший выходной формат для использования значения, извлеченного из файла в новом скрипте / процессе в Nextflow - PullRequest
1 голос
/ 10 апреля 2020

Тема: В поисках хорошего выходного формата для использования значения, извлеченного из файла в новом скрипте / процессе в Nextflow

Кажется, я не могу понять это:

I Я пишу некоторые процессы в 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
    """
}

РЕЗУЛЬТАТ СКРИПТА ПРОЦЕССА2 ПОСЛЕ ВАРИАНТА 1 (примечание: выход = 573, компоновка без изменений)

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

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Я в конце концов исправил это, добавив следующий код, который получает только цифры из моего вывода

... | tr-d c '0-9'

0 голосов
/ 12 апреля 2020

Как вы обнаружили, ваша командная строка записывает завершающий символ новой строки. Вы можете попытаться удалить его как-нибудь, возможно, отправив по трубопроводу другую команду, или (лучше), сделав рефакторинг, чтобы правильно проанализировать файлы отчетов. Ниже приведен пример использования для печати пятого столбца без завершающего символа новой строки. Это может хорошо работать для простого файла отчета CSV, но возможности разбора CSV в AWK ограничены. Так что, если ваши отчеты могут содержать поля в кавычках и т. Д. c, рассмотрите возможность использования языка, который предлагает синтаксический анализ CSV в своей стандартной библиотеке (например, Python и библиотека csv , или Perl и Текст :: 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» в четвертом столбце, а в пятом столбце есть некоторое значение со строкой length> = 1, это даст вам значение, которое вы можете использовать в процессе «присоединения». Но учтите, что это не поможет в случае, когда четвертый столбец в вашем файле никогда не будет равен «S». Он также не будет обрабатывать случай, когда ваш пятый столбец может быть пустым значением (длина строки == 0). В этих случаях stdout будет пустым, поэтому вы получите пустое значение в вашем выходном канале. Возможно, вы захотите добавить некоторый код, чтобы убедиться, что эти крайние случаи как-то обрабатываются.

...