seq (1)을 사용하여 숫자를 역순으로 표시하는 방법은 무엇입니까?


36

다양한 순서로 숫자를 반복했습니다. 다음과 같은 단계에서도 순서대로 표시 할 수 있습니다.

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

또한 연속적이거나 단계적으로 현명하지 않은 역순으로 표시 할 수도 있습니다.

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

위 명령에 대한 출력이 없습니다.

내 껍질 세부 사항 :

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

내림차순으로 숫자를 표시하는 방법을 알려주십시오.


10
미래의 독자 seq에게는 완전히 비표준 도구이며 두 가지 구현이 동일하다는 보장은 없습니다. bash에서 숫자를 거꾸로 반복하는 루프를 작성 해야하는 경우 등을 사용 for ((i=$max;i>=0;i--)) …하십시오.
kojiro 2013

답변:



20

일반적으로을 사용하고 싶지 seq않으며 이식성이 없습니다 (표준 Linux 환경에서도). ksh, zsh 또는 bash4 +를 사용하는 경우 중괄호 확장을 사용할 수 있습니다.

echo {10..1..2} | tr " " ,
10,8,6,4,2

1
짧고 빠르지 만 이전 bash 버전입니다.
mtk

20
좋은 대답이지만 seq비표준 이라고 지적하고 bash-4 전용 괄호 확장을 사용 하면 약간의 아이러니가 있습니다 . ;)
kojiro 2013

@kojiro-솔직한 주장은 없다 ;-) 나의 주요 관심사는 명령이 존재하는지 (스크립트가 배포되는지 등에 따라 중요하거나 중요하지 않을 수도 있음) 중 하나가 아니라 명령이 예상대로 실행되는지의 여부입니다. 저자. bash4의 괄호 확장은 거의 보장되지만 (작동하면 예상대로 작동 함) seq그렇지 않습니다.
Chris Down

1
휴대용이 아닌 이유는 무엇입니까? 출처 나 증거가 있습니까? 내가 관심.
Benoit Duffez

15

순수한 bash, ksh 또는 zsh의 다른 방법 :

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

순수한 POSIX sh 방법 :

i=10
while [ "$i" -gt 2 ]; do printf "$i,"; i=$((i-2)); done
echo "$i"

1
for의 두 번째 표현은 테스트이고 세 번째 표현은 단계입니다.
manatwork

7

이제 표준 POSIX 것들 :

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

(흥미롭게도,과 mawk(와 낮은 정도 gawk)뿐만 아니라 훨씬 빨리 GNU 이상 seq에 대한 i = 10000000대신 i = 10)

또는

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

(특히 반복 횟수가 적을수록 더 효율적입니다 bash)

또는

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

(모든 크기의 숫자를 지원하지만 특정 숫자 수를 지나면 ( POSIX 로켈에서 10 70 보다 큰 숫자 ) 줄은 백 슬래시로 줄 바꿈됩니다)


1
GNU bc에서는 BC_LINE_LENGTH=0환경 을 설정하여 줄 바꿈을 피할 수 있습니다. 다른 구현에는 그러한 행운이 없습니다.
Gilles 'SO- 악마 그만해'

1
왜 루프를 돌 s=$s,$i거나 echo -n/ echo \c/를 호출하는 대신 위치 인수를 사용 printf합니까?
Gilles 'SO- 악마 그만해'

2

tac(cat in reverse)를 사용하여 순서를 바꿀 수 있습니다 . seq다양한 시스템에서 다르게 작동해야 하더라도 다음은 가능한 한 이식성이 있어야한다고 생각합니다.

$ seq 1 10 | tr '\012' ',' | sed 's/,$//'; echo
1,2,3,4,5,6,7,8,9,10
$ seq 1 10 | tac | tr '\012' ',' | sed 's/,$//'; echo
10,9,8,7,6,5,4,3,2,1
$

2

시도해보십시오 :

   seq [OPTION]... FIRST INCREMENT LAST

예:

$ seq 10-1 1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.