J'ai une liste de fichiers:
catfish.fa polar.fa catfish.ids.txt polar.ids.txt
Je veux exécuter cette commande pour chaque fichier avec une chaîne de caractères correspondante. Par exemple, j'aimerais lancer ceci:
cat catfish.fa | seqkit grep -f catfish.ids.txt> catfish.output.fa
De même ...
cat polar.fa | seqkit grep -f polar.ids.txt> polar.output.fa
Comment puis-je exécuter cette commande pour chaque paire de fichiers dans le répertoire et en parallèle? Merci pour votre aide!
3 Réponses :
Avec Extension des paramètres de bash:
for file in *.fa; do seqkit grep -f "${file%%.*}.id.txt" >"${file%%.*}.output.fa" <"$file" & done
#!/bin/bash for f in *.fa do filename="${f%.*}" if [ -e ${f}.ids.txt ] then cat ${f}.fa | seqkit grep -f ${f}.ids.txt >${f}.output.fa fi done filename="${f%.*}" extracts the filename without extension, see here for an explanation. The purpose of the if is to single out only the files ending with .fa which have a corresponding .ids.txt file. If you want everything to be run in parallel on each pair, append a & at the end of the cat ${f}.fa ... file. (Beware to not generate too many parallel tasks!)
Cela exécutera une tâche par cœur de processeur en parallèle:
parallel --dry-run 'cat {} | seqkit grep -f {.}.ids.txt > {.}.output.fa' ::: *fa
Puis-je vous suggérer d'exécuter d'abord avec --dry-run
, afin que vous puissiez voir ce que sera exécuté?
parallel 'cat {} | seqkit grep -f {.}.ids.txt > {.}.output.fa' ::: *fa
Pensez également à consacrer 20 minutes à la lecture des chapitres 1 + 2 du livre GNU Parallel 2018 (imprimer: http://www.lulu.com/shop/ole-tange/gnu-parallel -2018 / paperback / product-23558902.html en ligne: https://doi.org/ 10.5281 / zenodo.1146014 ). Votre ligne de commande vous aimera pour cela.
Merci pour votre excellente ressource. Quand j'ai essayé cela, le terminal vient de renvoyer un ">". J'utilise macOS et la commande parallèle est installée.
Fin 'manquait. Fixé.
Oui, j'ai continué à le regarder et j'étais comme si il manquait un '. Merci pour votre aide et votre livre est excellent. Je vais passer du temps à l'apprendre.
Veuillez consulter: Que dois-je faire lorsque quelqu'un répond à ma question?