どのように私は、Red Hat Linuxの標準ツールを使用してファイル内の行をランダム化することができますか?

StackOverflow https://stackoverflow.com/questions/886237

質問

どのように私は、Red Hat Linuxで標準のツールを使用してファイル内の行をランダム化することができますか?

私はshufコマンドを持っていないので、私は、同じタスクを達成perlまたはawkワンライナーのようなものを探しています。

役に立ちましたか?

解決

とPerlワンライナーあなたが得る!

perl -MList::Util -e 'print List::Util::shuffle <>'

これは、モジュールを使用するが、モジュールは、Perlコード配布の一部です。それが十分ではない場合、あなたはあなた自身の圧延を検討してください。

私はそれがファイルを編集する必要があり-iフラグ(「エディット・イン・プレース」)でこれを使用してみました。ドキュメントは、それが動作するはず示唆ですが、それはできません。それはまだstdoutにシャッフルファイルを表示しますが、今回はそれが元を削除します。私はあなたがそれを使用していないお勧めします。

シェルスクリプトを考えてみます:

#!/bin/sh

if [[ $# -eq 0 ]]
then
  echo "Usage: $0 [file ...]"
  exit 1
fi

for i in "$@"
do
  perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new
  if [[ `wc -c $i` -eq `wc -c $i.new` ]]
  then
    mv $i.new $i
  else
    echo "Error for file $i!"
  fi
done

テストされていないが、うまくいけば動作します。

他のヒント

うーん、忘れてはいけないことができます。

sort --random-sort

shufが最善の方法です。

sort -Rは痛々しいほど遅いです。私はちょうど5ギガバイトのファイルを並べ替えることを試みました。私は、2.5時間後にあきらめました。その後shuf分でそれをソートします。

cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

、ファイル、先頭に追加乱数を持つすべての行を読んで、これらのランダムなプレフィックス上のファイルを並べ替え、その後プレフィックスを切りました。任意の半近代的なシェルで動作するはずワンライナーます。

EDIT:リチャード・ハンセンの発言組み込ま

Python用ワンライナーます:

python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile

や印刷だけで、単一のランダムな行のためのます:

python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile

しかし、Pythonのrandom.shuffle()の欠点のためのこの記事を参照してください。それは多くの(以上2080年)の要素とうまく動作しません。

ジムの答えに関連します:

私の~/.bashrcには、以下が含まれます:

unsort ()
{
    LC_ALL=C sort -R "$@"
}

これにより、各ラインや種類のランダムなハッシュを生成のGNU coreutilsののソート、-R = --random-sort、と。無作為化ハッシュは、実際に、それは私がLC_ALL=Cを設定する理由は、通常のソートされた出力を、返却させ、一部の古い(バギー)のバージョンでは、いくつかのロケールで使用できません。

<時間>

クリスの答えに関連します:

perl -MList::Util=shuffle -e'print shuffle<>'

はやや短いワンライナーです。 (-Mmodule=a,b,c-e 'use module qw(a b c);'の短縮形である。)

それをシンプル-iを与える理由は、その場でシャッフルのために動作しませんPerlはprintは、ファイルが読み込まれている同じループ内で起こることを期待し、すべての入力ファイルがされている後までprint shuffle <>が出力をしないためであります読んで閉じます。

短い回避策として、

perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'

その場でファイルをシャッフルします。 -nは、Perlはファイルを1つずつ割り当てる代わりに、ライン・アット・タイムの上で動作させ、そしてwhile (<>) {...}が暗黙のうちにファイル全体の代わりに行われているので、BEGIN{undef$/}が必要とされている;(split/^/m$_=<>ループ内のコードをラップする」という意味しますライン。)

私は自作でのcoreutilsをインストールすると、

brew install coreutils

shufnとして利用可能になります。

はDarwinPortsを搭載したMac OS X:

sudo port install unsort
cat $file | unsort | ...

FreeBSDは、独自のランダムな有用性を持っています:

cat $file | random | ...

それはあなたがゲームをインストールしていないので、もし、あなたが運の外では/ usr /ゲーム/ランダムでいます。

あなたはtextproc /ランドまたはtextproc / msortのようなポートをインストールすることを検討できます。移植性が懸念される場合、これらはよく、Linux、および/またはMac OS X上で利用できる場合があります。

またはMacPortsのからそれを得るます:

$ sudo port install coreutils

および/または

$ /opt/local//libexec/gnubin/sort --random-sort
scroll top