동시에 실행되는 여러 파일에 대한 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 파일이 있고 클러스터에서 병렬로 실행하고 싶습니다. 여러 bam 파일을 동시에 처리할 때 stdout.fq/stdin.fq가 서로 간섭하지 않도록 위 명령에서 stdout.fq 및 stdin.fq를 어떻게 사용할 수 있습니까?

감사해요

답변1

파일 확장자에 대해 매우 혼란스러워합니다. 그와 같은 일은 없다. MS-DOS와 CPM 이후로는 없습니다. Microsoft의 Windows는 여전히 이를 사용하여 파일 탐색기에서 작업을 실행하지만 파일 이름의 일부일뿐입니다.

So 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

/dev/stdin최신 Bash에서는 다음을 사용할 수 있습니다 /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

관련 정보