samtools/sed 用于编辑 bam 文件

samtools/sed 用于编辑 bam 文件

我有以下 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 )"

例如,这将给出filenamemyfileif is (即,它将删除任何路径元素以及指定的后缀)。$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/'

这会将字符串插入chrSN:XwhereX是染色体名称,将其转换为SN:chrX.但是,您需要使用而\( ... \)不是( ... )捕获组,或者将-E选项添加到 的调用中sed,否则您将收到错误消息“‘s’命令的 RHS 上的引用 \1 无效”(使用 GNU sed)或“\ 1 未在 RE 中定义(与 BSD 一起sed)。

相关内容