시퀀스 출력

시퀀스 출력
#!/bin/ksh
for i in `seq 1 10` ; do
  n=`expr $RANDOM`;
  (
    for (( k=1; k<=10; k++ ))
    do
      echo -n "$k"
    done
  )
  echo   "$k, $n"
done

이 스크립트를 작성했지만 정확한 결과가 나오지 않습니다.

12345678910, 17517
12345678910, 3695
12345678910, 8841
12345678910, 11553
12345678910, 2019
12345678910, 3503
12345678910, 25789
12345678910, 24825
12345678910, 8039
12345678910, 30532

1-10의 난수를 나란히 놓아야 하지만

답변1

어쩌면 다음과 같이 배열을 사용하여 r루프가 반복될 때마다 10개의 난수를 저장합니다 i.

#!/bin/ksh
for i in $(seq 1 10) ; do
  r=()
  for ((k=1; k<=10; k++)); do
    r+=($RANDOM)
  done
  echo "$i, ${r[@]}"
done

출력은 다음과 같습니다:

$ ./seq.ksh 
1, 28324 21310 5112 23165 31527 5779 17343 31716 11594 9769
2, 7205 15089 16436 10276 9784 18724 18137 20754 7878 11092
3, 12087 19351 25813 77 25109 12122 14299 287 21751 9714
4, 29046 17308 31024 1391 7705 29784 7170 25049 28732 18765
5, 2051 3169 1086 18488 13445 10871 4444 31583 31625 12323
6, 9907 10945 31675 2952 11023 24016 15075 25322 24303 4059
7, 2268 20582 21367 525 21973 29073 30309 29143 21355 26273
8, 15140 23406 29443 16227 9126 10121 27098 13571 8936 25956
9, 25894 18844 4134 24801 21797 15158 16049 4104 7712 7585
10, 8163 9981 28167 29531 10506 17372 25836 8047 13748 14423

업데이트: 귀하의 댓글을 본 후

#!/bin/ksh
for i in $(seq 1 10) ; do
  printf "%2i, %5i\n" "$i" "$RANDOM"
  # or if you prefer echo to printf, just:
  # echo "$i,$RANDOM"
done

산출:


 1, 23984
 2,  3987
 3, 31979
 4, 18977
 5,  1492
 6, 30008
 7, 17715
 8, 14603
 9, 20650
10,  9891

노트:

  1. 명령 대체에 백틱을 사용하지 말고 $()대신 백틱을 사용하십시오. 바라보다cmd백틱(예: *sh )은 셸에서 더 이상 사용되지 않습니까?
  2. 명령 대체나 다른 변수에 expr저장할 필요 없이 변수 할당( )만 사용하면 됩니다.$RANDOMvar="$RANDOM"
  3. printf출력 형식을 더 좋게 하려면 대신 사용하십시오 echo. printf를 사용하여 Perl과 유사한 함수를 작성할 수도 있습니다 join( join_by다음의 함수 참조).Bash에서 배열 요소를 연결하는 방법은 무엇입니까?좋은 예를 들자면 이 함수는 ksh와 bash 모두에서 작동합니다.

답변2

프로세스 대체를 이해하는 쉘이 있다고 가정합니다.

$ paste <( seq 10 ) <( shuf -n 10 -r -i 0-100 )
1       50
2       59
3       54
4       89
5       73
6       6
7       46
8       35
9       32
10      55

그러면 를 사용하여 탭으로 구분된 두 개의 숫자 열이 생성됩니다 paste.

첫 번째 열은 seqGNU 도구가 출력하는 1부터 10까지의 숫자입니다.

-r두 번째 열은 (다른 GNU 도구)에서 생성된 0에서 100 사이의 난수(로 인해 반복될 수 있음)로 구성됩니다 .shuf

탭 외에 다른 구분 기호를 원하시나요? 다음 -d과 함께 사용 하세요 paste:

$ paste -d , <( seq 10 ) <( shuf -n 10 -r -i 0-100 )
1,37
2,56
3,33
4,48
5,71
6,45
7,52
8,52
9,99
10,80

관련 정보