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