Boucler sur des paires de valeurs dans bash
J'ai 10 fichiers texte et je veux paste
chaque fichier avec la paire, de sorte que j'ai 5 total des fichiers.
J'ai essayé le suivant:
for i in 4_1 5_1 6_1 7_1 8_1
do
for j in 4_2 5_2 6_2 7_2 8_2
do
paste ${i}.txt ${j}.txt > ${i}.${j}.txt
done
done
Toutefois, ce code combine toutes les combinaisons possibles au lieu de simplement en combinant les paires correspondantes.
Donc je voudrais fichier 4_1.txt
être jumelé avec 4_2.txt
, 5_1.txt
avec 5_2.txt
, etc.
- Vous avez besoin de faire une boucle sur les préfixes et les suffixes pas de noms de fichiers complets.
- Le comportement que vous obtenez est la même chose que ce imbriquée
for
boucle ferait dans n'importe quelle langue; il n'y a rien bash-précis à ce sujet. - Chaque fois que je veux faire quelque chose de relativement simple comme une itération sur des paires de valeurs, Bash fait de la charge de travail ressembler à un insurmontable épique. Donc je ne pas utiliser bash quand avoir besoin de rien de plus complexe qu'une liste de shell appels.
- Cela devrait probablement être fusionné avec stackoverflow.com/questions/18909957/... mais j'hésite à les marquer comme étant des doublons en ce moment.
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser une variable et d'exécuter et d'action avec elle, vous avez juste besoin d'utiliser une boucle:
Cela va faire
paste "${file}"_{1,2}
printf '%s %s\n' {4..8}_{1,2} | xargs -I cmd paste cmd
xargs
sur les valeurs non cotées rapidement cumbles si vous avez non négligeable de noms de fichiers qui nécessitent citant ou de s'échapper.Je suis d'accord avec la réponse proposée par fedorqui dans le contexte de la question actuellement posée. Ci-dessous est donnée qu'à préciser un peu plus de réponses générales.
Une approche plus générale (pour bash 4.0 ou plus récent) est de stocker vos paires dans un tableau associatif:
Un autre (compatible avec les anciennes versions de bash) est d'utiliser plus d'un réseau classique:
Vous pouvez utiliser un tableau associatif:
Cela vous permet traversant paires, triplets, etc. Crédits: l'idée de départ est pris à partir de @CharlesDuffy-s réponse.
paste
-- de retour en 2015?Il y a un modèle commun où vous avez des paires de fichiers, d'où un nom de la paire peut facilement être calculée à partir de l'autre. Si le fichier que vous connaissez le nom de est X et l'autre fichier Y est, vous avez des cas d'utilisation courants.
Tous ces prêtent à la même approximative code squelette.
La clé ici est l'observation que
y
peut être dérivée à partir dex
avec une simple substitution de variables. Si vous en boucle sur lax
valeurs, et de comprendre le correspondanty
valeur à l'intérieur de la boucle.Ici, nous avons utilisé la coque est construite en
${variable#prefix}
et${variable%suffix}
opérateurs de retourner la valeur de la variable avec tous les premiersprefix
de début ou de finsuffix
, respectivement, rognés. (Il est également##
et%%
pour correspondre à la plus longue, au lieu de la plus courte possible. L'expression après#
ou%
est régulièrement shell glob modèle.) Ces dernières devraient être tout ce que vous devez, bien que vous consultez fréquemmentsed
ouawk
scripts de même pour ce travail trivial (où vraiment vous devriez essayer d'éviter un processus externe), ainsi que des cours pour les plus exigeants des transformations.Si vous avez besoin de faire une boucle sur
x
fichiers dispersés dans différents répertoires, peut-être que la boucle doit commencer avec quelque chose commeCouramment vu de problème similaire questions réponses qui ne parviennent pas à citer
$x
et$y
correctement. De manière générale, toute variable contenant un nom de fichier doit toujours être entre guillemets doubles.Où X et Y sont indépendants, une solution commune est en boucle ici un document contenant la cartographie:
le ci-dessus ne fonctionne pas pour moi, mais ce qui suit ne lire des valeurs dans les paires à partir d'une liste ordonnée
(peut être plus de paires en ajoutant plus de " lecture-lignes 🙂
produit