Параллельное чтение GNU из нескольких файлов

Я пытаюсь использовать параллель GNU для преобразования отдельных файлов с помощью биоинформатического инструмента под названием vcf2maf.

Моя команда выглядит примерно так:

${parallel} --link "perl ${vcf2maf} --input-vcf ${1} \
                                    --output-maf ${maf_dir}/${2}.maf \
                                    --tumor-id ${3} \
                                    --tmp-dir ${vcf_dir} \
                                    --vep-path ${vep_script} \
                                    --vep-data ${vep_data} \
                                    --ref-fasta ${fasta} \
                                    --filter-vcf ${filter_vcf}" :::: ${VCF_files} ${results} ${tumor_ids}

VCF_files, results и tumor_ids содержат по одной записи в строке и соответствуют друг другу.

Когда я пытаюсь запустить команду, я получаю следующую ошибку для каждого файла:

ERROR: Both input-vcf and output-maf must be defined!

Это меня смутило, потому что, если я запускаю команду вручную, программа работает так, как задумано, поэтому я не думаю, что пути ввода/вывода неверны. Чтобы подтвердить это, я также побежал

${parallel} --link "cat ${1}" :::: ${VCF_files} ${results} ${tumor_ids}, который правильно печатает содержимое файлов VCF, путь к которым указан в VCF_files.

Я действительно смущен, что я сделал неправильно, если кто-нибудь может мне помочь, я был бы очень благодарен!

Спасибо!


person nhaus    schedule 22.07.2020    source источник


Ответы (1)


Для такой длинной команды я бы обычно определял функцию:

doit() {
  ...
}
export -f doit

Затем проверьте это на одном входе.

Когда это работает:

parallel --link doit :::: ${VCF_files} ${results} ${tumor_ids}

Но если вы хотите использовать одну команду, она будет выглядеть примерно так:

${parallel} --link "perl ${vcf2maf} --input-vcf {1} \
                                --output-maf ${maf_dir}/{2}.maf \
                                --tumor-id {3} \
                                --tmp-dir ${vcf_dir} \
                                --vep-path ${vep_script} \
                                --vep-data ${vep_data} \
                                --ref-fasta ${fasta} \
                                --filter-vcf ${filter_vcf}" :::: ${VCF_files} ${results} ${tumor_ids}

Строки замены GNU Parallel: {1}, {2} и {3}, а не ${1}, ${2} и ${3}.

--dryrun — ваш друг, когда GNU Parallel не делает того, что вы от него ожидаете.

person Ole Tange    schedule 14.08.2020