web-dev-qa-db-ja.com

Red Hat Linuxの標準ツールを使用してファイル内の行をランダム化するにはどうすればよいですか?

Red Hat Linuxの標準ツールを使用してファイル内の行をランダム化するにはどうすればよいですか?

shufコマンドがないので、同じタスクを実行するPerlまたはawkワンライナーのようなものを探しています。

95
Stuart Woodward

そして、Perlのワンライナーが手に入ります!

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

モジュールを使用しますが、モジュールはPerlコード配布の一部です。それで十分でない場合は、独自のロールを検討することができます。

-iフラグ(「編集インプレース」)でこれを使用して、ファイルを編集してみました。ドキュメンテーションはそれが動作するはずであると示唆していますが、動作しません。シャッフルされたファイルはまだ標準出力に表示されますが、今回は元のファイルが削除されます。使用しないことをお勧めします。

シェルスクリプトを検討してください。

#!/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

テストされていませんが、うまくいけばうまくいきます。

62
Chris Lutz

あの、忘れないで

sort --random-sort
201
Jim T

shufが最善の方法です。

sort -Rは非常に遅いです。 5GBファイルをソートしようとしました。 2.5時間後にあきらめました。次に、shufが1分でソートしました。

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

ファイルを読み取り、すべての行に乱数を付加し、それらのランダムなプレフィックスでファイルをソートし、その後プレフィックスを切り取ります。セミモダンシェルで動作する1ライナー。

編集:リチャード・ハンセンの発言を取り入れました。

22
ChristopheD

Pythonのワンライナー:

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

ランダムな1行だけを印刷するには:

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

しかし、Pythonのrandom.shuffle()の欠点については この投稿 を参照してください。多くの(2080を超える)要素ではうまく機能しません。

9
scai

ジムの答えに関連:

私の_~/.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_は、「コードをwhile (<>) {...}ループでラップすることを意味します; _BEGIN{undef$/}_」は、Perlを一度に1行ずつではなく1ファイルずつ操作し、_split/^/m_が必要なのは、_$_=<>_が行ではなくファイル全体で暗黙的に行われているためです。)

5
ephemient

Homeutilでcoreutilsをインストールするとき

brew install coreutils

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

3
John McDonnell

DarwinPortsを搭載したMac OS X:

Sudo port install unsort
cat $file | unsort | ...
1
Coroos

FreeBSDには独自のランダムユーティリティがあります。

cat $file | random | ...

/ usr/games/randomにあるため、ゲームをインストールしていない場合は運が悪い。

Textproc/Randやtextproc/msortなどのポートのインストールを検討できます。移植性が懸念される場合、これらはLinuxやMac OS Xで利用可能です。

1
Coroos