私はAWKを使用して1から6の間の値を生成します。この値はランダムな順序で表示する必要があります。正しい数値範囲を生成するロジックをクリーンアップしましたが、重複した数値が出力されるのを防ぐために配列に読み込むのが困難です。現在私のコードには次のものがあります。
BEGIN{
FS=""
}{
for (i=1; i<=6; ++i) {
v=(int (rand()*6)+1
print v }
現在6つの数字を出力していますが、2、2、6、1、4、2の重複が表示されます。 1、4、2、5、6、3などの出力が必要です。
私のAWKプログラムの配列の側面に役立つ人がいますか?
非常にありがとう
ベストアンサー1
awk
少なくともほとんどのUnixシステムでは、以下を使用する必要があります。
$ seq 6 | shuf
5
2
3
4
1
6
または@ StéphaneChazelasがコメントで述べたようにshuf -i 1-6
。
本当にawkを使用したい場合は、awkを使用する方法があります。クヌスシャッフル:
$ cat tst.awk
function shuf(arr, i, j, n, tmp) {
n = length(arr)
for (i=n; i>1; i--) {
j = int( 1 + rand()*i )
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
}
BEGIN {
srand()
for (i=1; i<=n; i++) { arr[i] = i }
shuf(arr)
for (i=1; i<=n; i++) { print arr[i] }
}
$ awk -v n=6 -f tst.awk
3
1
5
4
6
2
必要な値で配列を入力し、配列内の各インデックスに格納されている値をランダムに選択した別のインデックスに格納されている値に置き換えて、配列を印刷します。
上記の関数はshuf()
配列の単一パスで機能します。