seq
한 줄에 하나씩 정수 시퀀스를 생성 하는 명령 을 알고 있지만 두 가지 질문을하고 싶습니다.
시퀀스 번호를 같은 줄에 쓸 수 있습니까?
공백으로 구분 된 일련의 숫자로 구성된 문자열을 만들 수 있습니까?
seq
한 줄에 하나씩 정수 시퀀스를 생성 하는 명령 을 알고 있지만 두 가지 질문을하고 싶습니다.
시퀀스 번호를 같은 줄에 쓸 수 있습니까?
공백으로 구분 된 일련의 숫자로 구성된 문자열을 만들 수 있습니까?
답변:
으로는 bash
, zsh
그리고 ksh93
, 당신은 사용할 수 있습니다 {start..end..step} 중괄호 확장 양식 :
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
모든 쉘 및 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 값을 재설정하는 것은 복잡 할 수 있습니다 . 자세한 내용은 여기를 참조하십시오 .
$ 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.
IFS='<space><tab><newline>'
곳에 사람들을 <space>
, <tab>
, <newline>
해당 리터럴 문자가 있습니다.
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는-제재 :
대부분의 표준 유틸리티는 텍스트 파일에서 작동 합니다 . 이
cut
유틸리티는 임의의 줄 길이를 가진 파일을 동일한 데이터를 포함하는 텍스트 파일 세트로 변환하는 데 사용할 수 있습니다. 이paste
유틸리티를 사용하여 임의의 줄 길이를 가진 파일을 만들거나 다시 만들 수 있습니다.0 개 이상의 줄로 구성된 문자가 포함 된 파일입니다. 행은 NUL 문자를 포함하지 않으며 ewline 문자를
{LINE_MAX}
포함하여 길이 가 바이트를 초과 할 수 없습니다\n
. POSIX.1-2008은 텍스트 파일과 이진 파일을 구분하지 않지만 (ISO C 표준 참조) 많은 유틸리티는 텍스트 파일에서 작업 할 때 예측 가능하거나 의미있는 출력 만 생성합니다. 이러한 제한이있는 표준 유틸리티는 항상 STDIN 또는 INPUT FILES 섹션 에 텍스트 파일 을 지정 합니다.
paste
기본값은 탭 구분 기호이므로 두 번째 명령 다음에 각 정수 사이에 탭이 있습니다. 당신은 할 수 ...
seq 10 |paste -sd ' ' -
... -d
elimiter 스위치를 사용하여 해당 동작을 변경하십시오.
seq 10 | xargs
잘 작동하지만 명령 줄 제한으로 인해 seq 100000 | xargs
5 개의 \n
구분 된 줄 (내 시스템에서)을 출력합니다.
paste and
cut`은 임의의 길이의 라인으로 작업하기위한 두 개의 POSIX 승인 유틸리티입니다. 그것은 xargs | xargs
옵션입니다. 또는 다른seq 100000|tr \\n \
$IFS
숫자를 설정해 보시지 않겠 습니까? 그리고 bash
어쨌든 속도가 느립니다. 당신의 대답에서 당신은 그것에 대해 이야기합니다 sh
-당신은 $IFS
그 맥락에서 설정할 필요조차 없습니다 -환경에 설정되면 환경을 통해 전달됩니다. 그리고 seq 100000|paste -s
성능 측면에서 5 : 1을 능가하는 것보다 짧지 않습니다 . 그리고 paste
어떤 어려움도 오지 않습니다.
$IFS
-나는 그것을 항상 사용한다-그러나 나는 그것을 설정 하지 않으면 당신을 사용하지 않으면 그것을 사용하지 않는다 . 특히 당신은 더 나은 thay을 모르는 낯선 낯선 사람에게 권장하지 않아야합니다. 우연히 두지 마십시오-컴퓨터 프로그램입니다. 예기치 않게 동작하면 버그입니다. 왜 그렇게 할 수 있습니까?
echo $(seq 1 10)