У меня есть следующая команда, которая работает с файлом BAM
reformat.sh in=test.bam out=stdout.fq primaryonly | reformat.sh in=stdin.fq out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
Идея здесь в том, чтобы избежать записи вывода первой команды (reformat.sh) в файл, что увеличивает общую скорость.
У меня есть несколько bam-файлов в моем текущем рабочем каталоге, и я хочу запустить их на кластере параллельно. Как использовать stdout.fq и stdin.fq в приведенной выше команде, чтобы при одновременной обработке нескольких bam-файлов stdout.fq/stdin.fq не мешали друг другу?
Спасибо
решение1
Вы совсем запутались с расширениями имен файлов. Такого понятия нет. Со времен MS-DOS и CPM. Windows от Microsoft все еще использует их для запуска действий в проводнике, но они являются просто частью имени файла.
Поэтому stdout
и stdout.fq
являются разными файлами. Также имя для stdout
есть /dev/stdout
, и stdin
есть/dev/stdin
решение2
Это зависит от того, как reformat.sh
написано.
Часто команды UNIX используют stdin и stdout, если вы не предоставляете им никаких данных ввода/вывода:
reformat.sh in=test.bam primaryonly |
reformat.sh out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
В других случаях они будут принимать - в качестве имени файла:
reformat.sh in=test.bam out=- primaryonly |
reformat.sh in=- out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
В современном Bash вы можете использовать /dev/stdin
и /dev/stdout
:
reformat.sh in=test.bam out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1=r1.fq.gz out2=r2.fq.gz interleaved addcolon
Чтобы избежать конфликта имен при параллельном запуске заданий, я бы создал функцию, которая принимает имена в качестве аргументов:
refo() {
in="$1"
out1="$2"1.fq.gz
out2="$2"2.fq.gz
reformat.sh in=/dev/stdin out=/dev/stdout primaryonly |
reformat.sh in=/dev/stdin out1="$out1" out2="$out2" interleaved addcolon
}
И назовите это так:
refo test.bam out
Если это сработает, вы сможете распараллелить работу с несколькими bam
файлами с помощью:
export -f refo
parallel refo {} {.} ::: *.bam