![seq의 출력을 무작위로 추출하는 방법은 무엇입니까?](https://linux55.com/image/52977/seq%EC%9D%98%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EB%AC%B4%EC%9E%91%EC%9C%84%EB%A1%9C%20%EC%B6%94%EC%B6%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 그것을 사용 seq
하여 난수 목록(1, 2, 3, 4...)을 생성할 수 있다는 것을 알고 있습니다.
이 숫자를 3, 1, 4, 2와 같이 임의의 순서로 입력하고 싶습니다.
나는 shuf
파일의 줄을 뒤섞는 데 무엇을 사용할 수 있는지 알고 있습니다. 따라서 이를 사용하여 seq
파일에 임의의 숫자를 쓴 다음 shuf
이를 셔플하거나 일종의 셔플 기능을 작성할 수 있습니다. 그러나 이것은 불필요하게 복잡해 보입니다. 단일 명령을 사용하여 배열의 항목을 무작위로 지정하는 더 쉬운 방법이 있습니까?
답변1
출력을 shuf
.
$ seq 100 | shuf
예
$ seq 10 | shuf
2
6
4
8
1
3
10
7
9
5
출력을 수평으로 하려면 파이프로 연결하십시오 paste
.
$ seq 10 | shuf | paste - -s -d ' '
1 6 9 3 8 4 10 7 2 5
$ seq 10 | shuf | paste - -s -d ' '
7 4 6 1 8 3 10 5 9 2
$ seq 10 | shuf | paste - -s -d ' '
9 8 3 6 1 2 10 4 7 5
사이에 쉼표를 넣으시겠어요? 구분 기호를 다음으로 변경합니다 paste
.
$ seq 10 | shuf | paste - -s -d ','
2,4,9,1,8,7,3,5,10,6
답변2
단일 명령을 사용하여 배열의 항목을 무작위로 지정하는 더 쉬운 방법이 있습니까?
십진 정수 배열이 있다고 가정해 보겠습니다.
arr=(4 8 14 18 24 29 32 37 42)
sum을 사용하여 배열 요소를 무작위 printf
로 지정할 수 있습니다 .shuf
$ arr=($(printf "%d\n" "${arr[@]}" | shuf))
$ echo "${arr[@]}"
4 37 32 14 24 8 29 42 18
(위에서는 수정하지 않았다고 가정합니다 $IFS
.)
및 와 같은 두 정수 사이의 난수만 필요한 경우 10
다음 옵션을 사용하는 것 20
외에 추가 절차가 필요하지 않습니다 .shuf
-i
$ shuf -i 10-20
12
10
20
14
16
19
13
11
18
17
15
인용 출처 man shuf
:
-i, --input-range=LO-HI
treat each number LO through HI as an input line
답변3
printf '%s, ' `seq 1 10 | shuf`
루프도 필요하지 않습니다 for
.
산출
7, 3, 4, 10, 2, 9, 1, 8, 5, 6,
이를 쉘 배열에 넣으려면 다음을 수행하십시오.
( set -- $(seq 1 10 | shuf) ; printf '%s, ' "$@" )
산출
5, 9, 7, 2, 4, 3, 6, 1, 10, 8,
그런 다음 쉘 배열에 있습니다.
쉘 배열에 넣으면 다음이 필요하지 않습니다 printf
.
( set -- $(seq 1 10 | shuf); IFS=, ; echo "$*" )
산출
9,4,10,3,1,2,7,5,6,8
그건 그렇고, seq
그들은 printf
완벽하게 일치합니다. 예를 들어, 문자열을 1000번 반복하고 싶다면 어떻게 해야 할까요?
printf 'a string\n%.0b' `seq 1 1000`
산출
a string
... a string
999번째 줄 나중에...
a string
또는...
printf 'a string,%.0b' `seq 1 10`
산출
a string,a string,a string,a string,a string,a string,a string,a string,a string,a string,
명령을 39번 실행하고 싶나요?
printf 'echo "run %d"\n' `seq 1 39` | . /dev/stdin
산출
run 1
... 38 run
행 이후 ...
run 39
답변4
shuf
다음과 같은 명령을 사용하여 출력을 무작위로 지정할 수 있습니다 .
%> for x in $(seq 1 10 | shuf); do echo -n "$x "; done; echo
4 10 8 7 1 6 3 5 2 9