배쉬-같은 줄의 숫자 시퀀스


20

seq한 줄에 하나씩 정수 시퀀스를 생성 하는 명령 을 알고 있지만 두 가지 질문을하고 싶습니다.

  1. 시퀀스 번호를 같은 줄에 쓸 수 있습니까?

  2. 공백으로 구분 된 일련의 숫자로 구성된 문자열을 만들 수 있습니까?


쉘은 공백과 같은 개행을 인수 분리 자로 취급합니다. 따라서 seq에는 구분자 인수가 있지만 더 간단한 것은echo $(seq 1 10)
user3188445

1
@ user3188445, 그것은 split + glob 연산자입니다 (기본적으로 공백과 줄 바꿈이 포함되어 있지만 변경할 수있는 IFS 특수 변수를 사용합니다). 쉘에 의해 수행되는 단어 토큰 화와는 별개입니다.
Stéphane Chazelas

답변:



21

암소 비슷한 일종의 영양 seq 는 구분 기호 ( -s) 옵션을 사용합니다.

$ seq -s ' ' 1 5
1 2 3 4 5

$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5

1
echo $(seq 5)잘 작동합니다.

13

모든 쉘 및 seq가있는 모든 시스템에 이식 가능 (이 질문은 태그로 표시됨)

시작이 1 인 경우

$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10

그렇지 않으면:

$ echo $(seq 5 10)
5 6 7 8 9 10

bc로 :

$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)

bash에서

echo {1..10}

노트 :

이 에코 솔루션은 IFS 값에 줄 바꾸기가 포함되어 있으면 기본적으로 작동합니다.
기본적으로 IFS는 <space> <tab> <newline> 시퀀스로 설정됩니다 . 그리고 쉘을 새로 시작할 때마다 재설정됩니다. 그러나 극단적 인 경우에 변경 사항이 우려되는 경우 몇 가지 해결책이 있습니다.

bash, zsh, ksh에서 IFS = $ '\ t \ n'을 사용하십시오 (이 답변의 나머지 부분을 모두 건너 뜁니다).


그러나 sh에서 IFS 값을 재설정하는 것은 복잡 할 수 있습니다 . 자세한 내용은 여기를 참조하십시오 .

IFS를 설정 해제하십시오.

$ unset IFS; echo $(seq 5 10)                           #Always work.

항상 작동합니다. 제공하는 스크립트와 같이 IFS 세트가 필요한 코드 (또는 하위 스크립트)가 아래에없는 경우OldIFS="$IFS" .

올바른 해결책.

sh 트릭 사용하기 :

sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd'  # correct.

의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
terdon

1
대부분의 sh 구현은 환경에서 발견 된 IFS를 무시합니다 (일부 애쉬 파생물, 일부 Bourne 쉘의 매우 오래된 버전 및 최신 포쉬). 참고 간단하게 할 수있는 IFS='<space><tab><newline>' 곳에 사람들을 <space>, <tab>, <newline>해당 리터럴 문자가 있습니다.
Stéphane Chazelas


0
seq 10 |xargs

...또는...

seq 10 |paste -s -

위의 두 명령은 정수를 공백으로 구분합니다. xargs기본적으로 모방 /bin/echo으로 설정되므로 각 정수는 단일 공백으로 구분됩니다. 그러나 기본적으로 최대 명령 줄 길이는 128K입니다. 이것을 조정할 수 있습니다 ...

seq 100000 | xargs -s2093009 | wc -l

... 인쇄 1. -s여기에 대한 값 은 임의적이지 않습니다. 더 높은 값을 시도한 후에 (어쨌든 효과가 있었지만 )xargs 유용한 메시지를 인쇄했습니다.

-s value should be <2093010

paste두 가지 중 하나입니다 (내 지식) 임의의 길이의 라인을 처리하기위한 유틸리티를 POSIX는-제재 :

paste사양 응용 프로그램 사용법 :

대부분의 표준 유틸리티는 텍스트 파일에서 작동 합니다 . 이 cut유틸리티는 임의의 줄 길이를 가진 파일을 동일한 데이터를 포함하는 텍스트 파일 세트로 변환하는 데 사용할 수 있습니다. 이 paste유틸리티를 사용하여 임의의 줄 길이를 가진 파일을 만들거나 다시 만들 수 있습니다.

텍스트 파일

0 개 이상의 줄로 구성된 문자가 포함 된 파일입니다. 행은 NUL 문자를 포함하지 않으며 ewline 문자를 {LINE_MAX}포함하여 길이 가 바이트를 초과 할 수 없습니다 \n. POSIX.1-2008은 텍스트 파일과 이진 파일을 구분하지 않지만 (ISO C 표준 참조) 많은 유틸리티는 텍스트 파일에서 작업 할 때 예측 가능하거나 의미있는 출력 만 생성합니다. 이러한 제한이있는 표준 유틸리티는 항상 STDIN 또는 INPUT FILES 섹션 에 텍스트 파일 을 지정 합니다.

paste기본값은 탭 구분 기호이므로 두 번째 명령 다음에 각 정수 사이에 탭이 있습니다. 당신은 할 수 ...

seq 10 |paste -sd ' ' - 

... -delimiter 스위치를 사용하여 해당 동작을 변경하십시오.


seq 10 | xargs잘 작동하지만 명령 줄 제한으로 인해 seq 100000 | xargs5 개의 \n구분 된 줄 (내 시스템에서)을 출력합니다.
Peter.O

@ Peter.O- paste and cut`은 임의의 길이의 라인으로 작업하기위한 두 개의 POSIX 승인 유틸리티입니다. 그것은 xargs | xargs옵션입니다. 또는 다른seq 100000|tr \\n \
mikeserv

의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
terdon

@BinaryZebra-아닙니다-당신이 생각하는 것과는 다릅니다. $IFS숫자를 설정해 보시지 않겠 습니까? 그리고 bash어쨌든 속도가 느립니다. 당신의 대답에서 당신은 그것에 대해 이야기합니다 sh-당신은 $IFS그 맥락에서 설정할 필요조차 없습니다 -환경에 설정되면 환경을 통해 전달됩니다. 그리고 seq 100000|paste -s성능 측면에서 5 : 1을 능가하는 것보다 짧지 않습니다 . 그리고 paste어떤 어려움도 오지 않습니다.
mikeserv

@BinaryZebra-왜 거짓말을합니까? 잘못된 정보를 유포하는 것을 좋아하기 때문에이 사이트에 상당한 규모의 답변 프로필이 있습니까? 아니면 사람들을 돕는 것을 좋아하고 배우는 동안 학습의 어려움을 즐기기 때문일까요? 어느 쪽이 더 타당하다고 생각합니까? 나는 그것을 좋아한다 $IFS-나는 그것을 항상 사용한다-그러나 나는 그것을 설정 하지 않으면 당신을 사용하지 않으면 그것을 사용하지 않는다 . 특히 당신은 더 나은 thay을 모르는 낯선 낯선 사람에게 권장하지 않아야합니다. 우연히 두지 마십시오-컴퓨터 프로그램입니다. 예기치 않게 동작하면 버그입니다. 왜 그렇게 할 수 있습니까?
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.