2017-08-10 31 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」。