2017-03-02 3 views
-1

Ich habe 5 Dateien (.fastq.gz) in einem Verzeichnis und möchte sie in .fa Datei konvertieren.Schleife über alle Dateien im selben Verzeichnis im Shell-Skript

, dies zu tun, ich benutze den folgenden Befehl für jede Datei separat:

zcat bs1.fastq.gz | paste - - - - | awk '{print ">"$1"\n"$3}' > bs1.fa 

wie kann ich den gleichen Befehl für alle Dateien zur gleichen Zeit durchführen? in der Tat meine Dateien sind:

bs1.fastq.gz 
bs2.fastq.gz 
bs3.fastq.gz 
bs4.fastq.gz 
bs5.fastq.gz 

und ich möchte bekommen:

bs1.fa 
bs2.fa 
bs3.fa 
bs4.fa 
bs5.fa 
+0

meine Antwort Habe, oder irgendwelche anderen, aussortieren Ihr Problem? Wenn ja, dann überlege dir bitte, ob du es als Antwort akzeptierst - indem du auf das grüne Häkchen neben der Stimmenzahl klickst. Wenn nicht, sag bitte, was nicht funktioniert hat, damit ich oder jemand anderes dir weiter helfen kann. Vielen Dank. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

Antwort

1

Einfache for Schleife funktionieren sollte:

for f in *.fastq.gz; do 
    file="${f%%.*}" 
    zcat "$f" | paste - - - - | awk '{print ">"$1"\n"$3}' > "$file.fa" 
done 
+1

15 Sekunden zu spät: D –

+0

@ user7249622: Hat dies für Sie funktioniert? – anubhava

0
#!/bin/bash 

for file in *.fastq.gz 
do 
    name=`echo "$file" | cut -d'.' -f1` 
    zcat $file | paste - - - - | awk '{print ">"$1"\n"$3}' > ${name}.fa 
done 

*.fastq.gz erhalten Dateien im aktuellen Verzeichnis mit anything.fastq.gz

echo "$file" | cut -d'.' -f1 teilt den Dateinamen auf den ersten . und übernimmt den ersten Teil.

+1

[Sie sollten keine Dateien mit ls analysieren] (http://mywiki.wooledge.org/ParsingLs) – Aserre

+0

Fixed it thanks. –

+0

@TobySpeight Danke, aktualisiert die Antwort. –

0

Dies sollte sie alle parallel GNU tun Parallel:

#!/bin/bash 
doit(){ 
    zcat $1 | paste - - - - | awk '{print ">"$1"\n"$3}' > $2 
} 
export -f doit 
parallel doit {} {\.} ::: bs*fastq.gz 
Verwandte Themen