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