ファイルの行をランダムにシャッフルしたい

テキストファイルの各行をランダムな順序で表示したい。

例えば以下のようなファイルがある。

1
2
3
4
5

各行をランダムな順序で並び替えて表示したい。

3
1
5
2
4

shuf

shufコマンドを使用すると、入力の各行をランダムにシャッフルして出力する。

$ shuf numbers.txt
3
1
5
2
4

実行するたびに異なる順序で出力される。

標準入力からシャッフル

パイプでコマンドの出力結果をシャッフルできる。

$ cat numbers.txt | shuf
2
5
1
4
3

指定した行数だけランダムに選択

-nオプションを使用すると、シャッフルした結果から指定した行数だけ出力する。

$ shuf -n 3 numbers.txt
5
2
1

5行のうち3行をランダムに選択して出力している。

ランダムな数値を生成

-iオプションで範囲を指定すると、ランダムな数値を生成できる。

$ shuf -i 1-10
7
2
9
1
5
10
3
8
4
6

-i 1-10で1から10までの数値をランダムな順序で出力している。

-nオプションと組み合わせると、範囲内からランダムに指定した個数の数値を選択できる。

$ shuf -i 1-100 -n 5
42
87
13
65
29

1から100までの範囲から5つの数値をランダムに選択している。

seq と組み合わせる方法

seqコマンドで数値の列を生成してshufでシャッフルする方法もある。

$ seq 1 10 | shuf
8
3
10
5
1
7
2
9
6
4

ただし、shuf -iオプションを使用する方が簡潔で効率的である。

macOS での使用

macOSには標準でshufコマンドが含まれていない。Homebrewでcoreutilsパッケージをインストールするとshufまたはgshufとして使用できるようになる。

$ brew install coreutils
$ gshuf numbers.txt
3
1
5
2
4

$ gshuf -i 1-10 -n 5
7
3
1
9
2