Bashシェルスクリプトで1から100までの数列からランダムに10個の数値をピックアップする

2021-05-20Bash

はじめに

テストデータの中からランダムにデータを n件 (例えば10件)、取り出そうと思いました。

ランダムに抽出する方法を紹介します。

検証環境

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 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. データを用意(ここでは1〜100にしています。)
  2. shuf コマンドでデータ全体をシャッフル(行の順番を入れ替えるコマンドです)
  3. 最初の10件を取得

head コマンドを使わない方法もあります。
shuf コマンドには -n オプションがあります。
これを使うとシャッフルした結果のうち、数件のみを出力させることができます。

$ seq 1 100| shuf -n 10
56
89
95
15
47
5
44
66
80
62

ひとこと

実際にはテストデータファイル data.txt からデータをピックアップする必要があったため、以下のような使い方をしました。

$ cat data.txt| shuf| head -n 10

そこそこ便利です。

2021-05-20Bash