我有需要将500+文件从.bam更改为.sam的文件,所以我尝试使用samtools。我在这里做了一些研究,找到了这个答案(在shell脚本中更改循环中的文件路径输出),并对其进行了修改,以适应我的工作:
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‘和’歧义重定向‘不存在。我查过了,它确实存在于划痕中。我也尝试过这样做,以防事情变得复杂:
for i in `ls ${/scratch/spectre/h/home/Data/}/*.bam`
do
samtools view -h <$i >${/scratch/spectre/h/home/Data_Sam}/$i.sam
done为此,我得到了${/scratch/spectre/h/home/Data/}/*.bam`的错误“坏替代”。
我还尝试了以下操作,并得到了错误“错误替换”:
for i in "ls ${/scratch/spectre/h/home/Data/}/*.bam";
do filename "${i%%.*}";
samtools view $i ${filename}.sam;
done有没有办法循环我的500+文件,将它们从bam更改为sam,并将它们存储在新的地方?
发布于 2022-07-01 22:04:00
在第一次尝试中,您要寻找的字符串替换语法是${parameter/pattern/string},其中参数被展开,结果是最长的模式匹配被字符串替代。注意,这个语法使用大括号,而不是括号(参见Bash手册中的壳参数展开 )。
我想这就是你想要做的
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}"
donehttps://stackoverflow.com/questions/72816094
复制相似问题