seq의 출력을 무작위로 추출하는 방법은 무엇입니까?

seq의 출력을 무작위로 추출하는 방법은 무엇입니까?

나는 그것을 사용 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 string999번째 줄 나중에...

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 

관련 정보