1600


例えば、以下のように、0から9までの数字が1行ずつ入っている内容のファイルがあったとします。

[code]

    1
    2
    (..)
    9
    10
    
[/code]

このファイルについて、上記の行がランダムで入れ替わっているような出力を得たいとします。例としては下のようにです。

[code]

    9
    5
    (..)
    1
    3
    
[/code]

もちろん、`Perl`のワンライナーを使ったり、あるいは`Ruby`や`Python`でこのような目的のスクリプトを書くことはできるのですが、これくらいのことであるならば、何らかのコマンドのパイプ(`|`)で繋いでいき、この出力を実現するような書き方があるような気がしました。もし、そのような方法があれば、教えて下さい。


CC BY-SA 3.0
2014-12-14T17:09:36.397
1594
2014-12-16T04:53:12.943
939
question
bash
Bashでパイプラインを用いて、テキストファイルの行をランダムに入れ替えた出力を得るには?


ファイルになっているのであれば、パイプを使うまでもなく、ソートのランダムオプション

[code]

    sort -R filename
    
[/code]

で出力できると思います。

Ubuntu 14

[code]

    $ cat numbers.txt
    0
    1
    2
    3
    4
    $ sort -R numbers.txt
    4
    2
    0
    3
    1
    
[/code]

* * *

# random sort が使えない環境のために追記

`sort -R`が使えない場合は以下の様にできるんじゃないかと思います。

[code]

    cat numbers.txt | awk '{print rand() " " $0}' | sort -k1 | cut -d ¥  -f 2-
    
[/code]


CC BY-SA 3.0
2014-12-14T17:24:05.797
1596
2014-12-15T00:48:25.667
2020-06-17T08:14:45.997
-1
728
1594
answer


`sort -R` はキーのハッシュでソートします。

[code]

       -R, --random-sort
             sort by random hash of keys
    
[/code]

`sort(1)` より抜粋

という特徴があり、同じキーがふくまれるときはシャッフルの結果に偏りがでてきます。

質問のテキストファイルでは問題ありませんが

[code]

    0
    0
    1
    1
    2
    2
    3
    3
    
[/code]

のようなファイルに対して処理すると数字ごとに偏ってでてきます。

もし、このような場合は `shuf(1)` が使えると思うので、こちらのコマンドを使うのがおすすめです。

[code]

    > whatis shuf
    shuf (1)             - generate random permutations
    
[/code]


CC BY-SA 3.0
2014-12-15T10:06:32.250
1600
2014-12-15T10:06:32.250
982
1594
answer


ワンライナー

[code]

    RANDOM=$$$(date +%s); while read x; do echo -e "$RANDOM\t$x"; done <file |sort |cut -f 2-
    
[/code]

* * *

複数行

[code]

    #!/bin/bash
    RANDOM=${$}$(date +%s)    # プロセスIDと時間で乱数の列を初期化(必須ではない)
    
    while read x; do          # xに一行読み込む
        echo -e "$RANDOM\t$x" # 行の先頭に乱数を追加して出力
    done <file |              # while文の標準入力を指定
    sort |                    # 乱数でソートされる
    cut -f 2-                 # 乱数を削除
    
[/code]


CC BY-SA 3.0
2014-12-16T04:53:12.943
1666
2014-12-16T04:53:12.943
3054
1594
answer