Utilisation de tableau pour transmettre dynamicment des fichiers à une commande sous UNIX

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