Red Hat Linux の標準ツールを使用して、ファイル内の行をランダム化するにはどうすればよいですか?
私はコマンドを持っていないので、同じタスクを達成する aまたはワンライナーshuf
のようなものを探しています。perl
awk
ええと、忘れないでください
sort --random-sort
shuf
が最善の方法です。
sort -R
痛いほど遅いです。5GBのファイルをソートしようとしました。2.5時間であきらめました。その後shuf
、1分で並べ替えました。
そして、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
テストされていませんが、うまくいけば動作します。
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
ファイルを読み取り、すべての行に乱数を追加し、それらのランダムなプレフィックスでファイルを並べ替え、後でプレフィックスを切り取ります。セミモダンなシェルで機能するワンライナー。
編集:リチャード・ハンセンの発言を取り入れました。
ジムの答えに関連:
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
ために必要です。)$_=<>
homebrew で coreutils をインストールすると
brew install coreutils
shuf
として利用可能になりますn
。
FreeBSD には独自の random ユーティリティがあります:
cat $file | random | ...
/usr/games/random にあるので、ゲームをインストールしていない場合は運が悪いです。
textproc/rand や textproc/msort などのポートをインストールすることを検討できます。移植性が懸念される場合、これらは Linux および/または Mac OS X で利用できる可能性があります。
または、MacPorts から入手します。
$ sudo port install coreutils
および/または
$ /opt/local//libexec/gnubin/sort --random-sort
OSX では、http://ftp.gnu.org/gnu/coreutils/などから最新のものを取得します。
./configure make sudo make install
... /usr/local/bin/sort --random-sort が表示されるはずです
/usr/bin/sort を台無しにすることなく