web-dev-qa-db-fra.com

Comment effectuer une boucle sur les fichiers qui ont la même chaîne avant le premier soulignement?

J'essaie d'effectuer une boucle sur Ubuntu dans laquelle je concalète deux fichiers dans un seul fichier. Le répertoire comporte des milliers de fichiers, qui sont tous venus par paires qui ont la même chaîne de caractères avant le premier soulignement. Par exemple, le répertoire contient les fichiers suivants:

uce-1348_.nexus.phy.fasta
uce-1348_Sample1.fasta
uce-1611_.nexus.phy.fasta
uce-1611_Sample1.fasta

J'ai essayé de jouer quelque chose dans le sens de

for i in *_*.fasta \
do
cat $i > $i.combined.fasta
done

mais cela ne fonctionne bien sûr pas, car il ne rend pas les fichiers combinés spécifiques à la chaîne avant le premier soulignement. Je dois avoir un fichier concaténé de Uce-1348 et un autre de UCE-1611 (il y a des milliers de fichiers supplémentaires, mais c'est un petit exemple de ce que je cherche.

Toute aide serait appréciée. J'ai entendu dire que vous pouvez mettre des cordes et des modèles, mais je ne sais toujours pas comment faire cela. Merci!

1
Justin

Vous devez boucler sur un des motifs et générer les autres noms de fichiers à l'aide expansion des paramètres

Ex.

for i in *_.nexus.phy.fasta; do 
  cat "$i" "${i/.nexus.phy/Sample1}" > "${i/_.nexus.phy/.combined}"
done
0
steeldriver

En plus de copier et de déplacer mmv peut également ajouter le contenu du fichier source à un nom cible.

mmv -a 'uce-*_*' 'uce-#1.combined.fasta'
0
bac0n