염색체 이름을 변경하려면 다음과 같은 sed 명령이 있습니다.
for file in /myoldpath/*.bam; do
filename=echo $file | cut -d "." -f 1
samtools view -H $file | sed -e 's/SN:([0-9XY])/SN:chr\1/' -e 's/SN:MT/SN:chrM/' | \
samtools reheader - $file > /mynewpath/${filename}_chr.bam
done
내 질문은 변수를 $filename
각각의 새 파일 이름의 일부로 유지하면서 결과를 새 경로에 삽입하는 방법입니다. 항상 결과를 삽입합니다 . /myoldpath/
이 부분의 구문에서 뭔가 빠졌나요 ?filename.chr.bam
/mynewpath/
$file > /mynewpath/${filename}_chr.bam
답변1
filename
변수 에 할당할 때 basename
다음과 같이 유틸리티를 사용할 수 있습니다.
filename="$( basename "$file" .bam )"
예를 들어, 다음과 같은 경우 filename
값 이 제공됩니다 myfile
(즉, 지정된 접미사와 함께 모든 경로 요소가 제거됩니다).$file
/my/data/myfile.bam
당신은 사용할 수도 있습니다
filename="/mynewpath/$( basename "$file" .bam )_chr.bam"
또는
filename="$( printf '/mynewpath/%s_chr.bam' "$( basename "$file" .bam )" )"
마지막 두 예에서는 나중에 리디렉션에 대신 "$filename"
사용 하게 됩니다."/mynewpath/${filename}_chr.bam"
에 관해서 sed
:
sed -e 's/SN:([0-9XY])/SN:chr\1/' -e 's/SN:MT/SN:chrM/'
이렇게 하면 염색체 이름이 있는 위치 chr
에 문자열이 삽입되어 로 변환됩니다 . 그러나 캡처 그룹 대신 사용하거나 's' 명령 호출에 옵션을 추가 해야 합니다 . 그렇지 않으면 's' 오류가 발생합니다. RHS 명령 \1에 대한 참조가 유효하지 않습니다."( GNU 사용 ) 또는 "\1이 RE(BSD 사용 )에 정의되어 있지 않습니다.SN:X
X
SN:chrX
\( ... \)
( ... )
-E
sed
sed
sed