2017-08-10 3 views
1

Ich habe viele Dateien im selben Verzeichnis und möchte sie in eine andere Datei konvertieren mit einem Bash-Befehl (.sam bis .bam). Ich habe diesen kleinen Befehl in bash geschrieben. es funktioniert gut, aber das Problem ist, dass alle resultierenden Dateien den gleichen Namen haben würden und folglich einander ersetzen und am Ende hätte ich nur eine Datei. Weißt du, wie ich diesen Befehl so ändern kann, dass ich .bam Datei für jede .sam Datei separat bekomme?Dateikonvertierung mit Bash-Befehl

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

Ich denke, dass Sie die Dateierweiterung ändern möchten. Die Konversation einer Datei ist eine andere Aktion (bedeutet ändern Sie die Datenstruktur) – reporter

+0

Ich denke, das Problem ist hier: output = "$ {BAM_OUTDIR} /alignment.bam"; – john

Antwort

0

Ich bin nicht mit bash fimliar, sondern ein Unix-Administrator hat mir ein Beispiel für Jahre, um die Zeilenumbrüche in Dateien (Unix zu gewinnen und umgekehrt) zu ändern: a

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

Also hier hypothetische Weise:

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

können Sie auch versuchen, diese:

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 

Statt die Ausgabe ls der Parsen - don't parse the output of ls - verwendet diese Schale Klackse alle * .sam Dateien in $ SAM_INDIR iterieren. Es verwendet dann eine Zwischenvariable base, um den eingehenden Dateinamen ohne den $ SAM_INDIR-Teil zu halten. Der Befehl samtools leitet dann die Ausgabe an eine Datei in $ BAM_OUTDIR weiter, benannt durch Entfernen der ".sam" vom Ende des Basisdateinamens und anschließendes Anhängen von ".bam".

Verwandte Themen