2016-04-19 8 views
0

ich Dateien mit dem folgende Namensmuster fusionieren muß:Merging fastq Dateien von Identifikatoren mit einem Shell-Skript

[SampleID]_[custom_ID01]_ID[RUN_ID]_L001_R1.fastq 
[SampleID]_[custom_ID02]_ID[RUN_ID]_L002_R1.fastq 
[SampleID]_[custom_ID03]_ID[RUN_ID]_L003_R1.fastq 
[SampleID]_[custom_ID04]_ID[RUN_ID]_L004_R1.fastq 

Ich brauche alle Dateien mit identischem [ProbeID] but different „Lanes“ (L001-L004 fusionieren). Das folgende Skript funktioniert gut, wenn direkt im Terminal laufen:

custom_id="000" 
RUN_ID="0025" 
wd="/path/to/script/" # was missing/ incorrect 

# get ALL sample identifiers 
touch temp1.txt 
for line in $wd/*.fastq ; do 
    fastq_identifier=$(echo "$line" | cut -d"_" -f1); 
    echo $fastq_identifier >> temp1.txt 
done 

# get all uniqe samples identical 
cat temp1.txt | uniq > temp2.txt 
input_var=$(cat temp2.txt) 

# concatenate all fastq (different lanes) with identical identifier 
for line in $input_var; do 
     cat $line*fastq >> $line"_"$custom_id"_ID"$Run_ID"_L001_R1.fastq" 
done 
rm temp1.txt temp2.txt; 

Aber wenn ich eine Skriptdatei (concatenate_fastq.sh) und ausführbar machen

$ chomd +x concatenate_fastq.sh 

und führen Sie es

$ ./concatenate_fastq.sh 

Ich habe den folgenden Fehler:

$ concatenate_fastq.sh: line 17: /*.fastq_000_ID_L001_R1.fastq: Keine Berechtigung # = Permission denied 

Thx auf Ihre Hinweise unten Ich löste das Problem, indem sie

wd=/path/to/script/ 
+0

"Keine Berechtigung" offenbar bedeutet "Zugriff verweigert". Verwenden Sie denselben Benutzer, um die Befehle in der Shell auszuführen und das Skript auszuführen? Funktionieren beide Läufe in denselben Verzeichnissen? – Aaron

+0

Schön! Und wo ist Linie 49? – hek2mgl

+0

Mein schlechtes. Ich habe den kommentierten Abschnitt im Skript übersprungen. Zeile 49 ist: cat $ Zeile * fastq >> $ Zeile "_" $ custom_id "_ID" $ Run_ID "_L001_R1.fastq" –

Antwort

1

Das unmittelbare Problem scheint zu sein, dass wd ungesetzt ist fixiert. Wenn Sie Skript wirklich wirklich enthält genau die Linie

wd="/path/to/script/" 

dann würde ich unsichtbares Steuerzeichen in der Skriptdatei vermuten (ein Windows-Editor ist ein gemeinsamer Weg, sich in den Fuß zu schießen).

Allgemeiner, Ihr Skript sollte korrekt zurechtkommen, wenn der Platzhalter keine Dateien enthält. Eine gängige Methode ist shopt -s nullglob, aber das nachfolgende Skript müsste dann noch angepasst werden.

Das Refactoring des Skripts zur Schleife nur über tatsächliche Übereinstimmungen würde helfen, Probleme zu vermeiden. Vielleicht etwas wie das:

shopt -s nullglob # bashism 
printf '%s\n' "$wd"/*.fastq | 
cut -d_ -f1 | 
uniq | 
while read -r line; do 
    cat "$line"*fastq >> "${line}_${custom_id}_ID${Run_ID}_L001_R1.fastq" 
done 

Sie werden feststellen, dass dies das Skript enorm vereinfacht, und vermeidet die lästigen temporären Dateien.

+0

im endgültigen Skript verwende ich "wd = $ 1"; Ich habe gerade versucht, ein einfaches Arbeitsbeispiel zu machen. –

1

Ich löste es mit:

if [ $# -ne 3 ] ; then 
    echo -e "Usage: $0 {path_to_working_directory} {custom_ID:Z+} {run_ID:ZZZZ}\n" 
    exit 1 
fi 

cwd=$(pwd) 
wd=$1 
custom_id=$2 
RUN_ID=$3 
folder=$(basename $wd) 

input_var=$(ls *fastq | cut --fields 1 -d "_" | uniq) 

for line in $input_var; do 
    cat $line*fastq >> $line"_"$custom_id"_ID"$RUN_ID"_L001_R1.fastq" 
done 
+0

Wenn Sie eine Variable für die Platzhalterübereinstimmungen verwenden, wird das Skript für Dateinamen mit Leerzeichen gelöscht. Und Sie sollten 'ls' nicht in Skripten verwenden. Das 'printf | schneiden | uniq | während lesen "Muster aus meiner Antwort löst diesen Teil. – tripleee