どのように私は、Red Hat Linuxの標準ツールを使用してファイル内の行をランダム化することができますか?
質問
どのように私は、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
shuf
はn
として利用可能になります。
はDarwinPortsを搭載したMac OS X:
sudo port install unsort
cat $file | unsort | ...
FreeBSDは、独自のランダムな有用性を持っています:
cat $file | random | ...
それはあなたがゲームをインストールしていないので、もし、あなたが運の外では/ usr /ゲーム/ランダムでいます。
あなたはtextproc /ランドまたはtextproc / msortのようなポートをインストールすることを検討できます。移植性が懸念される場合、これらはよく、Linux、および/またはMac OS X上で利用できる場合があります。
OSX上で、 http://ftp.gnu.org/gnu/coreutils/ <から最新のグラブ/ A>と
のようなもの./のconfigure 作ります sudoはmake installを
あなたを与える必要があります。...は/ usr / local / binに/ソート--randomソート
は/ usr / binに/ソート
をめちゃくちゃにせずにまたはMacPortsのからそれを得るます:
$ sudo port install coreutils
および/または
$ /opt/local//libexec/gnubin/sort --random-sort