Writing a bash loop to convert sams to bams
1
0
Entering edit mode
5.7 years ago
raf.marcondes ▴ 110

Hey all, I'm trying to write a small bash loop to iterate over all sam files in a directory converting them to bam. What I have so far is:

files=$(ls)
for f in "$files"
    do samtools view -S -b $f>"$f".bam
    done

But what I get when I run that is:

convert_sam_to_bam.sh: line 9: ACGGTC.1.sam
AGACCA.1.sam
AGCTTT.1.sam
AGGAAT.1.sam
[list of all sams in the directory]
TGACAT.1.sam
TTAGGC.1.sam
TTGACT.1.sam
TTGTCA.1.sam.bam: File name too long

I'm sure the problem is that I'm messing up with the quotations somewhere, but I can't for the life of me figure out where. Any thoughts? Thanks a lot in advanc!

alignment • 3.1k views
ADD COMMENT
1
Entering edit mode

This is a pure shell question. For starters, you don't need files=$(ls); for f in $files, you can simply do for f in * (or better, for f in *.sam). In fact, I think doing that will solve your problem as your current approach treats a set of filenames as a string instead of treating it as an array.

ADD REPLY
1
Entering edit mode
5.7 years ago
st.ph.n ★ 2.7k
for file in *.sam; do
    samtools view -S -b $file > "`basename $file .sam`.bam"
done
ADD COMMENT
1
Entering edit mode

You don't need the basename sub-shell call, you can simply use ${file/%sam/bam}. Bash has powerful parameter expansion.

ADD REPLY

Login before adding your answer.

Traffic: 1667 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6