約6k行(各行が非常に長い)が含まれる〜1GBのテキストファイルがあり、その行をランダムにシャッフルする必要があります。出来ますか?おそらくawkで?
shuf
コマンドはGNU coreutilsから使用できます。このユーティリティはかなり高速で、1 GBのファイルをシャッフルするのに1分もかかりません。
shuf
は出力ファイルを開く前に完全な入力を読み取るため、以下のコマンドはあなたのケースでうまくいくかもしれません:
$ shuf -o File.txt < File.txt
Pythonワンライナー:
python -c 'import sys, random; L = sys.stdin.readlines(); random.shuffle(L); print "".join(L),'
標準入力からすべての行を読み取り、それらをその場でシャッフルし、最後の改行を追加せずにそれらを出力します(,
末尾から)。
OSXの場合、バイナリはgshuf
と呼ばれます。
brew install coreutils
gshuf -o File.txt < File.txt
私のように、macOS用のshuf
の代替を探すためにここに来た場合は、randomize-lines
を使用してください。
rl
と同様の機能を持つshuf
コマンドを含むrandomize-lines
(homebrew)パッケージをインストールします。
brew install randomize-lines
Usage: rl [OPTION]... [FILE]...
Randomize the lines of a file (or stdin).
-c, --count=N select N lines from the file
-r, --reselect lines may be selected multiple times
-o, --output=FILE
send output to file
-d, --delimiter=DELIM
specify line delimiter (one character)
-0, --null set line delimiter to null character
(useful with find -print0)
-n, --line-number
print line number with output lines
-q, --quiet, --silent
do not output any errors or warnings
-h, --help display this help and exit
-V, --version output version information and exit
これを見つけた場所を忘れてしまいましたが、shuffle.pl
使用するもの:
#!/usr/bin/Perl -w
# @(#) randomize Effectively _unsort_ a text file into random order.
# 96.02.26 / drl.
# Based on Programming Perl, p 245, "Selecting random element ..."
# Set the random seed, PP, p 188
srand(time|$$);
# Suck in everything in the file.
@a = <>;
# Get random lines, write 'em out, mark 'em done.
while ( @a ) {
$choice = splice(@a, Rand @a, 1);
print $choice;
}
少なくともubuntuには、shuf
というプログラムがあります
shuf file.txt