вывод stdout и stdin для нескольких одновременно запущенных файлов

вывод stdout и stdin для нескольких одновременно запущенных файлов

У меня есть следующая команда, которая работает с файлом 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

Связанный контент