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


11

seq1, 2, 3, 4의 임의의 숫자 목록을 생성하는 데 사용할 수 있다는 것을 알고 있습니다 ...

3, 1, 4, 2와 같은 임의의 순서로 그 숫자를 얻고 싶습니다 ...

shuf파일 줄을 섞는 데 사용할 수 있다는 것을 알고 있습니다 . 따라서 seq임의의 숫자를 파일에 shuf쓰고 셔플하는 데 사용할 수 있습니다. 또는 일종의 셔플 기능을 작성할 수 있습니다. 그러나 이것은 불필요하게 복잡해 보입니다. 단일 명령으로 배열의 항목을 무작위로 만드는 더 간단한 방법이 있습니까?

답변:


16

출력을에 파이프하면됩니다 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

그러나 어떻게 든 쉼표로 한 줄에 넣을 형식을 지정해야합니다. echo $(seq 10 | shuf)가까이 오지만 쉼표를 사용하지 않습니다.
mikeserv

그것은 전에 수평 paste...
mikeserv

@ mikeserv-주변을 바꿨습니다.
slm

네. 당신은 간다. 나는 그것을 몰랐다 paste. 가르쳐 주셔서 감사합니다. 공감하십시오.
mikeserv

@mikeserv - 그래, 스테판 나 질 A의 사용 중 내보고 사이트를 통해 읽기 joinpaste. 이 두 도구는 매우 강력합니다.
slm

3

단일 명령으로 배열의 항목을 무작위로 만드는 더 간단한 방법이 있습니까?

십진 정수의 배열이 있다고 가정합니다.

arr=(4 8 14 18 24 29 32 37 42)

배열의 요소를 사용 printf하고 shuf무작위 화 할 수 있습니다 .

$ arr=($(printf "%d\n" "${arr[@]}" | shuf))
$ echo "${arr[@]}"
4 37 32 14 24 8 29 42 18

위의 내용은 수정하지 않았다고 가정합니다 $IFS.


두 정수 사이의 임의의 숫자 (예 : 10and 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

cks 스. 나는 그것도 shuf --help보았지만 shuf -i 1 10개입없이 -dash.잘 사용하려고 노력했다 .
mikeserv

2
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

... 999 a string줄 후에 ...

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

1

shuf명령을 사용 하여 출력을 무작위 화 할 수 있습니다.

%> for x in $(seq 1 10 | shuf); do echo -n "$x "; done; echo
4 10 8 7 1 6 3 5 2 9 

1

POSIX : 에서 10 진수의 셔플 된 목록을 생성 min하려면 max:

awk -v min=1 -v max=10 'BEGIN{
  for (i = min; i <= max; i++) a[i] = i
  srand()
  for (i = min; i <= max; i++) {
    j = int(rand() * (max - min + 1)) + min
    tmp = a[i]; a[i] = a[j]; a[j] = tmp
  }
  for (i = min; i <= max; i++) print a[i]
}'

많은 awk 구현에서 동일한 초 내에 두 번 해당 명령을 실행하면 동일한 결과가 생성됩니다 ( srand()현재 시간을 기반으로 의사 난수 생성기 를 시드).

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