2017-08-10 163 views
1

我在同一目录中有很多文件,并且想要使用bash命令(.sam.bam)将它们转换为另一个文件。我用bash写了这个小命令。它工作正常,但问题是所有生成的文件将具有相同的名称,因此相互替换,最后我只有一个文件。你知道我怎样才能改变这个命令,使得我分别为每个.sam文件获得.bam文件?使用bash命令进行文件转换

BAM_OUTDIR="bam_files" 
SAM_INDIR="sam_files" 

ls -1 ${SAM_INDIR}/*.sam | while read file; do 

    echo "conversion of sam to bam started ..................." 
    dn=$(dirname "$file"); 
    output="${BAM_OUTDIR}/alignment.bam"; 
    samtools view -Sb "${file}" > "${output}" 
done 
+0

我想你想改变文件扩展名。文件对话是一个不同的动作(意味着改变数据结构) – reporter

+0

我认为问题在这里:output =“$ {BAM_OUTDIR} /alignment.bam”; – john

回答

0

我不使用bash fimliar,但多年来的UNIX管理员给了我一个例子来改变文件的换行符(Unix的取胜,反之亦然):

for i in `ls *.conf` 
do 
    unix2dos <$i >$i.new 
done 

所以这里假设方式:

for i in `ls ${SAM_INDIR}/*.sam` 
do 
    samtools view -Sb <$i >${BAM_OUTDIR}/$i.bam 
done 
0

你也可以试试这个:

BAM_OUTDIR="bam_files" 
SAM_INDIR="sam_files" 

ls -1 ${SAM_INDIR}/*.sam | while read file; do 

    echo "conversion of sam to bam started ..................." 
    dn=$(dirname "$file"); 
    new_bn=$(basename "$file" | sed s%sam$%bam%); 
    output="${BAM_OUTDIR}/$new_bn"; 
    samtools view -Sb "${file}" > "${output}" 
done 
0
BAM_OUTDIR="bam_files" 
SAM_INDIR="sam_files" 
for file in $SAM_INDIR/*.sam; do 
    echo "conversion of sam to bam started ..................." 
    base=$(basename $file); 
    samtools view -Sb "${file}" > "${BAM_OUTDIR}/${base%.sam}.bam" 
done 

而不是解析输出LS - don't parse the output of ls - 这使用shell globs遍历$ SAM_INDIR中的所有* .sam文件。然后它使用中间变量base来保存传入文件名,而不包含$ SAM_INDIR部分。然后samtools命令将输出重定向到$ BAM_OUTDIR中的文件,该文件通过从基文件名末尾删除“.sam”命名,然后附加“.bam”。