Sé combinar el resultado de un comando diferente.
paste -t',' <(commanda) <(commandb)
Sé canalizar la misma entrada a un comando diferente
cat myfile | tee >(commanda) >(commandb)
¿Ahora cómo combinar estos comandos? Para que yo pueda hacer
cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb
Digamos que tengo un archivo
mi archivo:
1
2
3
4
Quiero hacer un nuevo archivo
1 4 2
2 3 4
3 2 6
4 1 8
solía
cat myfile | tee >(tac) >(awk '{print $1*2}') | paste
me daría un resultado vertical, donde realmente quiero pegarlos en orden horizontal.
bash
shell-script
text-processing
pipe
process-substitution
usuario40129
fuente
fuente
Respuestas:
Cuando haces tee con múltiples sustituciones de proceso, no tienes la garantía de obtener el resultado en un orden particular, por lo que es mejor que te quedes con
Suponiendo que
cat myfile
representa una tubería costosa, creo que tendrá que almacenar la salida, ya sea en un archivo o una variable:Usando tu ejemplo:
Otro pensamiento: FIFOs, y una sola tubería
fuente
El
yash
shell tiene características únicas ( redirección de canalización y redirección de proceso ) que lo hacen más fácil allí:3>>|4
( redirección de canalización ) crea una canalización donde el final de escritura está en fd 3 y el final de lectura en fd 4.3>(commanda>&3)
es la redirección de procesos , un poco como la sustitución de procesos ksh / zsh / bash, pero solo realiza la redirección y no la sustituye por/dev/fd/n
.ksh
's>(cmd)
es más o menos lo mismo queyash
' sn>(cmd) /dev/fd/n
(hayn
un descriptor de archivo elegido porksh
el cual no tiene control).fuente
Con
zsh
:Luego use como:
Eso está adaptado de esta otra pregunta donde encontrará algunas explicaciones detalladas y sugerencias sobre las limitaciones (¡cuidado con los puntos muertos!).
fuente
Para su ejemplo particular, no debería haber necesidad
paste
y el resto. A menudo es cierto que cuando encontramos un límite con el conjunto de herramientas estándar es porque lo que queremos hacer de una manera se puede hacer de otra manera. Como:... que imprime ...
Puede obtener un archivo con el contenido que menciona en su
"$@"
matriz de shell como ...Y para validar los valores arg en un bucle como el anterior, puede cambiar un poco la prueba inicial ...
... que imprime un error en stderr solo si una línea leída
set -- $(cat)
contiene una línea que no consiste completamente en un solo entero.fuente