Como exibir números em ordem reversa usando seq (1)?

29

Tenho iterar em números em várias ordens. Eu sou capaz de exibi-los em ordem crescente, mesmo com etapas como:

$ seq --separator="," 1 10
1,2,3,4,5,6,7,8,9,10
$ seq --separator="," 1 2 10
1,3,5,7,9

Também sou capaz de exibi-los em ordem inversa, nem contínua nem passo a passo.

$ seq --separator="," 10 1   
$ seq --separator="," 10 2 1

Nenhuma saída para os comandos acima.

Detalhes da minha concha:

$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Deixe-me saber como eu poderia exibir os números em ordem decrescente?

    
por mtk 15.02.2013 / 10:47

6 respostas

44

use incremento negativo

seq -s, 10 -2 1
10,8,6,4,2
    
por 15.02.2013 / 11:10
20

Em geral, você não quer usar seq , não é portátil (mesmo entre ambientes Linux padrão). Se você estiver usando ksh, zsh ou bash4 +, você pode usar a expansão de chaves:

echo {10..1..2} | tr " " ,
10,8,6,4,2
    
por 15.02.2013 / 10:54
13

Outra maneira no bash puro, ksh ou zsh:

for ((i=10;i>0;i-=2)) ; do echo -n "$i," ; done

Um caminho POSIX puro:

i=10
while [ "$i" -gt 2 ]; do printf "$i,"; i=$((i-2)); done
echo "$i"
    
por 15.02.2013 / 11:28
7

Agora, os POSIX padrão:

awk 'BEGIN{for (i = 10; i > 0; i -= 2) print i}' | paste -sd , -

(curiosamente, com mawk (e, em menor grau, gawk também) muito mais rápido que o GNU seq para i = 10000000 em vez de i = 10 )

Ou

i=10; set --
while [ "$i" -gt 0 ]; do
  set -- "$@" "$i"
  i=$(($i - 2))
done
IFS=,
echo "$*"

(só seria mais eficiente com um pequeno número de iterações, especialmente com bash )

Ou

echo 'for(i=10;i>0;i-=2) i' | bc | paste -sd , -

(que suportaria números de qualquer tamanho, mas observe que após um determinado número de dígitos (números maiores que 10 70 no local POSIX, pelo menos), as linhas seriam agrupadas com barras invertidas)

    
por 15.02.2013 / 13:41
2

Você pode inverter o pedido usando tac (cat reverso). Mesmo que seq deva se comportar de maneira diferente em vários sistemas, acho que o seguinte deve ser o mais portátil possível:

$ seq 1 10 | tr '2' ',' | sed 's/,$//'; echo
1,2,3,4,5,6,7,8,9,10
$ seq 1 10 | tac | tr '2' ',' | sed 's/,$//'; echo
10,9,8,7,6,5,4,3,2,1
$
    
por 16.02.2013 / 16:09
2

Experimente:

   seq [OPTION]... FIRST INCREMENT LAST

Exemplo:

$ seq 10 -1 1

    
por 02.07.2014 / 12:55