Red Hat Linuxの標準ツールを使用してファイル内の行をランダム化するにはどうすればよいですか?
shuf
コマンドがないので、同じタスクを実行するPerl
またはawk
ワンライナーのようなものを探しています。
そして、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
テストされていませんが、うまくいけばうまくいきます。
あの、忘れないで
sort --random-sort
shuf
が最善の方法です。
sort -R
は非常に遅いです。 5GBファイルをソートしようとしました。 2.5時間後にあきらめました。次に、shuf
が1分でソートしました。
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
ファイルを読み取り、すべての行に乱数を付加し、それらのランダムなプレフィックスでファイルをソートし、その後プレフィックスを切り取ります。セミモダンシェルで動作する1ライナー。
編集:リチャード・ハンセンの発言を取り入れました。
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を超える)要素ではうまく機能しません。
ジムの答えに関連:
私の_~/.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
_が必要なのは、_$_=<>
_が行ではなくファイル全体で暗黙的に行われているためです。)
Homeutilでcoreutilsをインストールするとき
brew install coreutils
shuf
はn
として使用可能になります。
DarwinPortsを搭載したMac OS X:
Sudo port install unsort
cat $file | unsort | ...
FreeBSDには独自のランダムユーティリティがあります。
cat $file | random | ...
/ usr/games/randomにあるため、ゲームをインストールしていない場合は運が悪い。
Textproc/Randやtextproc/msortなどのポートのインストールを検討できます。移植性が懸念される場合、これらはLinuxやMac OS Xで利用可能です。