web-dev-qa-db-fra.com

Comment chatouiller pour la boucle

J'ai 500 dossiers contenant beaucoup de fichiers * _1.fastq.gz et * _2.fastq.gz par dossier.

Je veux:

cat *_1.fastq.gz > Combined *_1.fastq.gz & cat *_2.fastq.gz > Combined_2.fastq.gz

par dossier.

Comment puis-je y arriver? J'aimerais apprendre quelques bash, je suis à l'aise avec le python

1
zazga
for i in {1..2} ; do cat *_$i.fastq.gz >>Combined_$i.fastq.gz ; done

Cela ne fonctionnera probablement pas bien, en tant que fichiers gzip concaténés; J'imagine que vous préféreriez utiliser zcat *_$i.fastq.gz >>Combined_$i.fastq & puis gzip; ou peut-être mieux, abandonnez simplement l'idée de chat et faites ceci:

for i in {1..2} ; do tar -c *_$i.fastq.gz >Combined_$i.fastq.gz.tar; done

par dossier - pour récidiver les dossiers, il suffit de placer la ligne ci-dessus dans une boucle supplémentaire et de l'exécuter à partir du dossier de niveau supérieur:

for f in *; do
  pushd . ; cd $f
      for i in {1..2} ; do tar -c *_$i.fastq.gz >Combined_$i.fastq.gz.tar; done
  popd
done

Donc ici, l’index de la boucle $ f choisit chaque dossier; sauve votre place; les cd dans le dossier; exécute la boucle; retourne au répertoire original et boucle à nouveau.

Les pushd/popd sont là pour s'assurer qu'une erreur ne vous empêche pas de parcourir le système de fichiers! Pas strictement nécessaire, mais utile à apprendre.

2
Mark Williams

Ce n’est pas un bon exemple d’apprentissage de bash, mais la façon la plus simple est de:

zcat *_1.fastq.gz | gzip > Combined_1.fastq.gz &
zcat *_2.fastq.gz | gzip > Combined_2.fastq.gz

En utilisant une boucle:

for f in *_1.fastq.gz; do
    zcat "$f"
done | gzip > Combined_1.fastq.gz

Remarques

  • vous parcourez les résultats d'un motif global - ne soyez pas tenté d'analyser le résultat de ls ( http://mywiki.wooledge.org/ParsingLs )
  • citez votre "$variables" quand vous voulez la valeur
  • vous pouvez rediriger ou diriger la sortie de la totalité d'une boucle for ou while.
1
glenn jackman