2015-03-26 6 views
2

У меня есть следующая параллельная команда GNU.GNU Параллельный аргумент в замене процесса bash

parallel --gnu --jobs 4 \ 
    normalize-by-median.py \ 
     -k 20 -C 20 --paired -N 4 -x 6e9 \ 
     --out pdom-{}-diginorm.fq \ 
     pdom-{}.fq.gz \ 
    ::: 200bp 500bp 1kb 3kb 8kb 

Я хотел бы сжать выход перед записью на диск. Обычно я просто передавал бы это gzip -c, но, к сожалению, этот конкретный скрипт Python не имеет возможности отправлять вывод в stdout. Затем я подумал, что вместо этого я могу заменить процесс. Я попробовал следующее.

parallel --gnu --jobs 4 \ 
    normalize-by-median.py \ 
     -k 20 -C 20 --paired -N 4 -x 6e9 \ 
     --out >(gzip -c - > pdom-{}-diginorm.fq.gz) \ 
     pdom-{}.fq.gz \ 
    ::: 200bp 500bp 1kb 3kb 8kb 

Однако фигурные скобки в последнем примере интерпретируется буквально подпроцесс, а не в качестве заполнителя для параллельных аргументов GNU. Есть ли способ заставить это работать?

ответ

3

Ваша проблема заключается в том, что>() интерпретируется до начала GNU Parallel. Так что вам нужно процитировать, что дать ее GNU Parallel:

parallel --gnu --jobs 4 \ 
    normalize-by-median.py \ 
     -k 20 -C 20 --paired -N 4 -x 6e9 \ 
     --out '>(gzip -c - > pdom-{}-diginorm.fq.gz)' \ 
     pdom-{}.fq.gz \ 
    ::: 200bp 500bp 1kb 3kb 8kb 

С версии> 20140822 Вы можете сделать это:

parallel --plus --gnu --jobs 4 \ 
    normalize-by-median.py \ 
     -k 20 -C 20 --paired -N 4 -x 6e9 \ 
     --out '>(gzip > {..}-diginorm.fq.gz)' \ 
     {} \ 
    ::: pdom-*