Je sais combiner le résultat de différentes commandes
paste -t',' <(commanda) <(commandb)
Je sais diriger la même entrée vers une commande différente
cat myfile | tee >(commanda) >(commandb)
Maintenant, comment combiner ces commandes? Pour que je puisse faire
cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb
Dis que j'ai un fichier
mon fichier:
1
2
3
4
Je veux créer un nouveau fichier
1 4 2
2 3 4
3 2 6
4 1 8
j'ai utilisé
cat myfile | tee >(tac) >(awk '{print $1*2}') | paste
me donnerait un résultat vertical, où je veux vraiment les coller dans l'ordre horizontal.
Réponses:
Lorsque vous effectuez plusieurs substitutions de processus, vous n'êtes pas assuré d'obtenir la sortie dans un ordre particulier, vous devriez donc vous en tenir à
En supposant que cela
cat myfile
représente un pipeline coûteux, je pense que vous devrez stocker la sortie, dans un fichier ou une variable:En utilisant votre exemple:
Une autre pensée: les FIFO et un pipeline unique
la source
Le
yash
shell possède des fonctionnalités uniques ( redirection de pipeline et redirection de processus ) qui facilitent cela:3>>|4
( redirection de pipeline ) crée un canal où l'extrémité d'écriture est sur fd 3 et l'extrémité de lecture sur fd 4.3>(commanda>&3)
est la redirection de processus , un peu comme la substitution de processus ksh / zsh / bash mais fait juste la redirection et ne se substitue pas avec le/dev/fd/n
.ksh
s>(cmd)
est plus ou moins le même queyash
sn>(cmd) /dev/fd/n
(iln
y a un descripteur de fichier choisi parksh
lequel vous n'avez aucun contrôle).la source
Avec
zsh
:Ensuite, utilisez comme:
C'est adapté de cette autre question où vous trouverez des explications détaillées et des conseils sur les limites (méfiez-vous des blocages!).
la source
Pour votre exemple particulier, il ne devrait pas être nécessaire
paste
et le reste. Il est souvent vrai que lorsque nous rencontrons une limite avec l'ensemble d'outils standard, c'est parce que ce que nous voulons faire d'une manière peut être fait d'une autre. Tel que:... qui imprime ...
Vous pouvez obtenir un fichier avec un contenu comme vous le mentionnez dans votre
"$@"
tableau shell comme ...Et pour valider les valeurs d'arg dans une boucle comme celle ci-dessus, vous pouvez modifier un peu le test initial ...
... qui affiche une erreur sur stderr uniquement si une ligne lue avec
set -- $(cat)
contient une ligne qui n'est pas entièrement composée d'un seul entier.la source