동시에 실행되는 여러 파일에 대해 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는 여전히 이를 사용하여 파일 탐색기에서 작업을 실행하지만 파일 이름의 일부일뿐입니다.

그러므로 stdoutstdout.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

관련 정보