Como eu canalizo uma lista de números diretamente do shell para um comando?

4

Como posso enviar uma lista de números diretamente do shell para um comando? Por exemplo, algo como isto

[1,2,3,4] | sort

daria

1
2
3 
4

EDITAR:

Em resposta às respostas gentilmente postadas até agora. . . Eu pergunto isso, porque eu quero testar rapidamente e depurar um aplicativo de console que leva muitos números como entrada sem ter que digitar muitos valores individuais seguidos por retornos de carro. Eu gostaria apenas de digitar o 'one liner' e clicar na seta para cima de vez em quando para repetir o comando. Idealmente, eu gostaria de fazer isso sem usar um arquivo de texto contendo os valores (o que obviamente seria a maneira mais simples de fazer isso).

    
por learnvst 22.11.2012 / 00:41

5 respostas

4

Estou assumindo que estamos usando números de um único dígito. Nesse caso, echo 1 2 4 3 | grep -o [1234567890]|sort deve fazer o truque. Eu acho que você teria que ajustar o regex para grep se for um número de vários dígitos.

grep -o seleciona como por regex e imprime um por linha

edit: e uma solução ainda mais elegante.

ainda usamos echo, mas com tr. Isso funciona com números maiores que um dígito

echo 10,2,4,3|tr ',' '\n'|sort -g

tr está sendo instruído a substituir uma vírgula por uma nova linha e ordenar -g em ordem numérica (supondo que é o que você quer classificar).

Supondo que você precise dos colchetes na lista por algum motivo estranho, você pode removê-lo com

echo [10,2,4,3]|tr '[:punct:]' ' '|tr ' ' '\n'|sort -g

O comando tr adicional substitui qualquer pontuação por um espaço.

    
por 22.11.2012 / 01:47
5

Você pode usar um documento "here" usando o operador de redirecionamento << in-line i / o. O shell procura o token que você fornecer (neste exemplo, eof ) como o marcador de final de arquivo para o documento here.

sort << eof
1
2
3
4
eof

Outra forma seria iterar os valores, echo los em ordenação:

for i in 1 2 3 4; do echo $i; done | sort

Se você quiser que o loop for seja empacotado como um comando, use um procedimento:

list() for i in $*; do echo $i; done
list 1 2 3 4 | sort
    
por 22.11.2012 / 00:47
3
$ printf '%d\n' 1 3 2 4 | sort
1
2
3
4

ou

$ echo $'1\n2\n4\n3' | sort
1
2
3
4
    
por 22.11.2012 / 05:07
2

Você pode usar cat

cat | sort 
1
2
4
3
^d (end of input)
    
por 22.11.2012 / 00:49
2

A resposta “super simples”: digite o comando e digite a entrada. (Estritamente falando, isso não é canalização. A palavra “pipe” é muito usada em referência ao redirecionamento de E / S, e isso nem seria redirecionamento de E / S, é apenas E / S padrão.) Fim com Ctrl + D (assumindo que você está em alguma forma de * nix ou algo similar ao Unix, e que você não alterou seu caractere EOF). Por exemplo:

(prompt)> sort –f
The
quick
brown
fox

Ctrl+D
brown
fox
quick
The

(prompt)>

A Ctrl + D pode ser exibida como ^D , e a primeira linha da saída pode aparecer na mesma linha que esta:

^Dbrown
fox
quick
The
    
por 22.11.2012 / 01:02