Bashシェルスクリプトで1〜100までの数からランダムに10個を重複なしで取り出す方法
はじめに
テストデータの中からランダムにデータを n件 (例えば10件)、取り出そうと思いました。
ランダムに抽出する方法を紹介します。
検証環境
$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
$ shuf --version | head -n 2
shuf (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
$RANDOM
環境変数を使った方法
$RANDOM
環境変数を使う方法が思いつきましたが、問題がありました。
$ echo $((RANDOM%100+1))
上記方法では、1から100までのランダムな値が取得はできますが、同じものが取得されることがあります。 ( ex: 1 99 3 53 1 5 20 19 80 100
で、 1 が重複している )
同じデータを重複して取得しないようにするにはどうしたらよいでしょう?
shuf
コマンドとパイプを使った方法
以下のワンライナーで実現できます。
$ seq 1 100| shuf| head -n 10
- データを用意(ここでは1〜100にしています。)
shuf
コマンドでデータ全体をシャッフル(行の順番を入れ替えるコマンドです)- 最初の10件を取得
head
コマンドを使わない方法もあります。shuf
コマンドには -n
オプションがあります。
これを使うとシャッフルした結果のうち、数件のみを出力させることができます。
$ seq 1 100| shuf -n 10
56
89
95
15
47
5
44
66
80
62
shuf
コマンドのみを使った方法
shuf
コマンドだけでもっとシンプルに実現する方法があります。
shuf
コマンドには、「ランダムに出力する数値の範囲」を -i
オプションで指定できます。
$ shuf -i 1-100 -n 10
29
70
71
89
74
24
61
66
90
76
$ shuf -i 1-100 -n 10
17
67
9
23
81
62
3
31
47
55
shuf -i
を使う場合、シャッフルする連続する数値の範囲を任意に指定できます。
例えば 10から15までの数値をシャッフルして出力 するには以下のようなコマンドを実行します。
$ shuf -i10-15
12
14
10
15
13
11
$ shuf -i10-15
11
15
12
13
14
10
ひとこと
実際にはテストデータファイル data.txt からデータをピックアップする必要があったため、以下のような使い方をしました。
$ cat data.txt| shuf| head -n 10
そこそこ便利です。
ディスカッション
コメント一覧
まだ、コメントがありません