unix 使用SAMtools并存储大量文件的输出

yshpjwxd  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(159)

我有500多个文件需要从.bam更改为.sam,所以我尝试使用samtools。我在这里做了一些查找,找到了这个答案(Changing file paths outputs within a loop, in a shell script),并修改了它以适合我的工作:

input_files="/scratch/spectre/h/homeTCGA_Data/*.bam"
output_files="/scratch/spectre/h/home/Data_Sam"
for i in $input_files 
do
tmp=$(i/scratch/spectre/h/home/Data_Sam) 
samtools view -h $i > $(tmp/.bam/.sam)
done

我是一个完全的新手,所以我假设我犯了一个明显的错误。我得到的错误是,目录'Data_Sam'不存在沿着'模糊重定向'。我已经检查,它肯定存在的scratch。我也尝试了这样的情况下,我的方式过于复杂的事情:

for i in `ls ${/scratch/spectre/h/home/Data/}/*.bam`
 do
 samtools view -h <$i >${/scratch/spectre/h/home/Data_Sam}/$i.sam
 done

对于这个我得到了错误'bad substitution'为${/scratch/spectre/h/home/Data/}/*.bam '。
我还尝试了以下方法,并得到错误'bad substitution':

for i in "ls ${/scratch/spectre/h/home/Data/}/*.bam";
do filename "${i%%.*}";
samtools view $i ${filename}.sam;
done

有没有什么办法,我可以循环超过我的500多个文件,改变他们从巴姆到山姆和存储他们的地方新的?

gab6jxml

gab6jxml1#

在第一次尝试中,您要寻找的字串替代语法是${parameter/pattern/string},其中 parameter 会展开,而在结果中,最长的 pattern 相符项目会被 string 替代。请注意,此语法使用大括号,而不是圆括号(请参阅Bash手册中的Shell Parameter Expansion)。
我想这就是你想做的:

input_files="/scratch/spectre/h/home/Data/*.bam"
for i in $input_files 
do
    tmp=${i/Data/Data_Sam}                 # replace 'Data' with 'Data_Sam'
    samtools view -h $i > ${tmp/.bam/.sam} # replace '.bam' with '.sam'
done

通过一些小的修改,您可以轻松地使它对包含空格或在中间某处包含“.bam”的文件名更加健壮:

input_files="/scratch/spectre/h/home/Data/*.bam"
for i in $input_files 
do
    tmp="${i/Data/Data_Sam}"
    samtools view -h "$i" > "${tmp/%.bam/.sam}"
done

相关问题