J’ai quatre fichiers ( file_one
à file_four
), le contenu de ces fichiers n’est pas vraiment important. Je veux transmettre trois de ces fichiers à une commande ( paste
ou awk
) dans un ordre particulier défini par un tableau. Mon tableau est d’ order=(two one four)
. J’espérais utiliser le tableau pour transmettre les fichiers souhaités à la commande en entrée de la même manière que vous pourriez utiliser *
(c’est-à-dire paste file_* > combined_file
);
paste file_${order[@]} > combined_file
paste file_"${order[@]}" > combined_file
paste file_"${order[*]}" > combined_file
paste file_"{${order[@]}}" > combined_file
paste file_{"${order[@]}"} > combined_file
J’ai regardé différentes pages ( 1 , 2 , 3 ou 4 ) mais je ne peux pas le faire fonctionner. Une loop
dans les fichiers ne fonctionne pas dans le cas de paste
ou awk
. Je veux transmettre les fichiers en une fois à une commande. Vu que ma connaissance d’ UNIX
est limitée, j’ai peut-être mal interprété certaines solutions / réponses. D’après ce que je comprends de cette réponse, il pourrait y avoir des problèmes avec la façon dont les tableaux ont été développés à l’origine dans bash
.
Résultat souhaité: paste file_two file_one file_four > combined_file
Vous pouvez utiliser printf
:
paste $(printf "file_%s " ${order[@]}) > combined_file
Cela évite d’avoir à parcourir tous les éléments du tableau de order
.
Alternativement, en utilisant bash ism , vous pouvez utiliser ceci:
paste ${order[@]/#/file_} > combined_file
Notez le #
qui correspond au début du modèle comme mentionné dans la page de manuel bash:
$ {paramètre / modèle / chaîne}
(…) Si pattern commence par #, il doit correspondre au début de la valeur étendue du paramètre.
Vous pouvez avoir la boucle for dans $ ():
paste $(for i in ${order[@]}; do echo file_$i; done) > output_file