coreutilsのshuf(1)
は、入力を行単位でランダムにシャッフルしてくれる便利なコマンドである。FreeBSDやmacOSのようなcoreutilsが標準的に含まれていない環境では、代わりにsort(1)
に-R
オプションを与えることで同様にシャッフルできる: sort(1)
どちらのコマンドでも乱数のシードをファイルから得る--random-source
オプションを使えば、再現性のあるシャッフルが可能である。特に、shuf(1)
に対して/dev/zero
を乱数ソースに用いると、以下のように入力行がそのままの順序で出力されるようだ。(coreutils 8.26のshuf(1)
で確認。)
$ echo -e 'A\nB\nC\nD\nE' | shuf --random-source /dev/zero
A
B
C
D
E
$
一方、
$ echo -e 'A\nB\nC\nD\nE' | sort -R --random-source /dev/zero
とすると、BSD由来のsort(1)
だとハングし、coreutilsのsort(1)
では必ずしも入力行の順序を維持しない。