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