J'ai un script s1
qui produit une liste de nombres séparés par ',' par exemple 1,2,3,4
. Maintenant, je veux donner ces nombres au script s2
comme arguments, afin que s2 soit exécuté sur chacun d'eux et produise son résultat sur une ligne distincte. Par exemple, si s2 multiplie les nombres par deux, ce serait le résultat que je recherche:
2
4
6
8
Ce que je fais en ce moment, c'est:
s1 | xargs -d "," | xargs -n1 s2
Mais j'ai l'impression de le faire d'une manière si stupide! Ma question est donc:
Quelle est la bonne façon de procéder?
Mon problème avec ma solution est qu'il appelle deux fois xargs et itère deux fois sur l'entrée, ce qui n'est pas raisonnable à mes yeux bien sûr en termes de performances! La réponse xargs -d "," -n1
semble agréable, mais je ne suis pas sûr que ce soit une seule fois. Si c'est le cas, veuillez le vérifier dans votre réponse et je l'accepterai. Soit dit en passant, je préfère ne pas utiliser Perl car il répète toujours deux fois et Perl peut également ne pas exister sur de nombreux systèmes.
s1 | xargs -d "," -n1 s2
Réponses:
Cela devrait également fonctionner:
Cas de test:
Résultat:
Si
s1
affiche cette liste suivie d'un caractère de nouvelle ligne, vous voudrez la supprimer car sinon le dernier appel serait avec4\n
au lieu de4
:la source
Si
s2
peut accepter plusieurs arguments, vous pouvez faire:qui remplace temporairement IFS pour être une virgule, le tout dans un sous-shell, de sorte que
s2
la sortie de soits1
décomposée par des virgules. Le sous-shell est un moyen rapide de modifier IFS sans enregistrer la valeur précédente ou la réinitialiser.Une version précédente de cette réponse était incorrecte, probablement en raison d'un paramètre IFS résiduel, corrompant les résultats. Merci à ilkkachu d' avoir signalé mon erreur .
Pour boucler manuellement les sorties et les fournir individuellement
s2
, démontrez ici la sauvegarde et la réinitialisation d'IFS:ou exécutez les bits IFS dans un sous-shell comme précédemment:
la source
bash -c 'IFS=, printf "%s\n" $(echo 1,2,3)'
imprime1,2,3
sur mon système, c'est-à-dire qu'il n'y a pas de division./usr/bin/printf
et/bin/echo
(IFS=,; printf "%s\n" $(echo 1,2,3))
, en revanche, devrait fonctionner.Essaye ça:
la source
tr ',' '\n'
? Pas besoin d'invoquer quelque chose d'aussi (relativement) lourd que Perl et des expressions régulières.