use incremento negativo
seq -s, 10 -2 1
10,8,6,4,2
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?
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
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"
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)
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
$
Experimente:
seq [OPTION]... FIRST INCREMENT LAST
Exemplo:
$ seq 10 -1 1
Tags command-line seq