Eu sei como combinar o resultado de comando diferente
paste -t',' <(commanda) <(commandb)
Eu sei canalizar a mesma entrada para comando diferente
cat myfile | tee >(commanda) >(commandb)
Agora, como combinar esses comandos? Para que eu possa fazer
cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb
Digamos que eu tenho um arquivo
meu arquivo:
1
2
3
4
Eu quero fazer um novo arquivo
1 4 2
2 3 4
3 2 6
4 1 8
eu usei
cat myfile | tee >(tac) >(awk '{print $1*2}') | paste
me dá resultado verticalmente, onde eu realmente quero colá-los na ordem horizontal.
bash
shell-script
text-processing
pipe
process-substitution
user40129
fonte
fonte
Respostas:
Quando você faz o tee para várias substituições de processo, não é garantido que você obtenha a saída em qualquer ordem específica, então é melhor ficar com
Supondo que
cat myfile
representa algum pipeline caro, acho que você precisará armazenar a saída, em um arquivo ou em uma variável:Usando seu exemplo:
Outro pensamento: FIFOs e um único pipeline
fonte
O
yash
shell possui recursos exclusivos ( redirecionamento de pipeline e redirecionamento de processo ) que facilitam a tarefa:3>>|4
( redirecionamento de pipeline ) cria um canal em que o final de gravação está no fd 3 e o final da leitura no fd 4.3>(commanda>&3)
é o redirecionamento de processo , um pouco como a substituição do processo ksh / zsh / bash, mas apenas faz o redirecionamento e não o substitui pelo/dev/fd/n
.ksh
's>(cmd)
é mais ou menos o mesmo queyash
' sn>(cmd) /dev/fd/n
(nãon
é um descritor de arquivo escolhido porksh
sobre o qual você não tem controle).fonte
Com
zsh
:Então use como:
Isso foi adaptado dessa outra questão, na qual você encontrará explicações detalhadas e dicas sobre as limitações (cuidado com os impasses!).
fonte
Para o seu exemplo particular, não deve haver necessidade
paste
e o resto. Muitas vezes, é verdade que, quando encontramos um limite com o conjunto de ferramentas padrão, é porque o que queremos fazer de uma maneira pode ser feito de outra. Tal como:... que imprime ...
Você pode obter um arquivo com conteúdo como você menciona em seu
"$@"
array de shell como ...E para validar os valores de arg em um loop como o acima, você pode alterar um pouco o teste inicial ...
... que imprime um erro no stderr somente se uma linha lida com
set -- $(cat)
contiver uma linha que não consiste inteiramente de um único número inteiro.fonte