シーケンス出力

シーケンス出力
#!/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

これにより、を使用してタブで区切られた2つの数値列が作成されますpaste

最初の列は、seqGNUツールが出力する1から10までの数字です。

-r2番目の列は、(他の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

関連情報