2016-03-30 7 views
0

Relative Unix-Neuling. Ich habe eine Reihe von Verzeichnissen (Sample*/), innerhalb derer ich alle raw.sort.bam-Dateien unter Verwendung von Sammeldateien zusammenführen möchte. Ich habe funktionierenden Code, um dies in jedem Verzeichnis zu tun, aber ich möchte mit allen Verzeichnissen gleichzeitig umgehen, indem ich Code aus dem übergeordneten Verzeichnis ausführen. Mein Problem ist, dass ich dazu gezwungen bin, Sammeldaten mit einem vollständigen Pfad aufzurufen, und ich habe Probleme herauszufinden, wie dieser Pfad innerhalb einer Unix-Schleife funktioniert.Umgang mit Pfaden in Unix-Schleifen

Zuerst, hier ist mein Arbeits Code für die Zusammenführung und Umwandlung von in jedem Verzeichnis:

/home/user/pathtosamtools/sam merge -o all.sort.bam *raw.sort.bam 

Nun, meint nicht arbeit Code versucht, dies für alle Verzeichnisse zu tun, wenn aus dem übergeordneten Verzeichnis ausgeführt:

for f in `ls Sample*/`; do /home/user/pathtosamtools/sam merge -o $f all.sort.bam Sample*/*raw.sort.bam; done 

Fehler:

[bam_merge_core_ext] fail to open file all.sort.bam 
[bam_header_read] bgzf_check_EOF: Invalid argument 
[bam_header_read] invalid BAM binary header (this is not a BAM file). 
Segmentation fault 

Vielen Dank im Voraus.

Antwort

0

Don't parse ls

for dir in Sample*/; do 
    /home/user/pathtosamtools/sam merge -o "$dir/all.sort.bam" "$dir"/*raw.sort.bam 
done 

Sie stellen die glob Muster in der for-Schleife.

Für die Sicherheit, always quote your variables.

+0

Das funktioniert, tausend Dank! Danke auch für einige Best-Practice-Tipps. Viel zu lernen. – user6130897