108

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

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

4

11 に答える 11

222

ええと、忘れないでください

sort --random-sort
于 2009-05-20T11:42:22.757 に答える
124

shufが最善の方法です。

sort -R痛いほど遅いです。5GBのファイルをソートしようとしました。2.5時間であきらめました。その後shuf、1分で並べ替えました。

于 2012-02-10T16:16:27.587 に答える
64

そして、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

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

于 2009-05-20T05:17:02.323 に答える
24
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

ファイルを読み取り、すべての行に乱数を追加し、それらのランダムなプレフィックスでファイルを並べ替え、後でプレフィックスを切り取ります。セミモダンなシェルで機能するワンライナー。

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

于 2009-05-20T05:36:18.203 に答える
5

ジムの答えに関連:

My~/.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うまくいかない理由printは、ファイルが読み込まれているのと同じループで発生し、print shuffle <>すべての入力ファイルが読み込まれて閉じられるまで出力されないことを Perl が期待しているためです。

より短い回避策として、

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

ファイルをその場でシャッフルします。( -n「コードをwhile (<>) {...}ループでラップすることを意味BEGIN{undef$/}します。Perl が一度に行単位ではなく一度にファイル単位で動作するようにします。これは、行ではなくファイル全体で暗黙的に実行されているsplit/^/mために必要です。)$_=<>

于 2009-05-20T16:20:04.740 に答える
3

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

brew install coreutils

shufとして利用可能になりますn

于 2013-04-11T02:02:48.007 に答える
1

FreeBSD には独自の random ユーティリティがあります:

cat $file | random | ...

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

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

于 2013-07-16T12:52:50.160 に答える
-1

または、MacPorts から入手します。

$ sudo port install coreutils

および/または

$ /opt/local//libexec/gnubin/sort --random-sort
于 2011-10-14T17:38:31.193 に答える
-1

OSX では、http://ftp.gnu.org/gnu/coreutils/などから最新のものを取得します。

./configure make sudo make install

... /usr/local/bin/sort --random-sort が表示されるはずです

/usr/bin/sort を台無しにすることなく

于 2011-03-28T12:35:30.627 に答える