2
votes

Exécuter la commande sur une paire de fichiers (différents types de fichiers) avec la chaîne de caractères correspondante

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 :


1
votes

Avec Extension des paramètres de bash:

for file in *.fa; do seqkit grep -f "${file%%.*}.id.txt" >"${file%%.*}.output.fa" <"$file" & done


0 commentaires

2
votes
#!/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!)

0 commentaires

1
votes

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.


3 commentaires

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.