大きなテキストファイルの行をランダムにシャッフルする


11

約6k行(各行が非常に長い)が含まれる〜1GBのテキストファイルがあり、その行をランダムにシャッフルする必要があります。出来ますか?おそらくawkで?

回答:


19

GNU coreutilsshufコマンドを使用できます。このユーティリティはかなり高速で、1 GBのファイルをシャッフルするのに1分もかかりません。

以下のコマンドshufは、出力ファイルを開く前に完全な入力を読み取るため、あなたのケースではうまくいくかもしれません:

$ shuf -o File.txt < File.txt

ありがとう、私がOSXを使用していることを説明するのを忘れていました。
ddmichael 2014年

6
@ddmichael実行brew install coreutilsして使用します/usr/local/bin/gshuf
Lri 2014年

2
@ddmichaelあるいは、OS Xの場合、このPerl 1ライナーを使用できます。これは古いブログの1つです。簡単なテストを行ったところ、問題はありませんでした。 cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' 私はそれがどれほど速く走るかは確かです
Suraj Biyani 2014年

4

Pythonワンライナー:

python -c 'import sys, random; L = sys.stdin.readlines(); random.shuffle(L); print "".join(L),'

標準入力からすべての行を読み取り、それらをその場でシャッフルし、最後の改行を追加せずにそれらを出力します(,末尾からの通知)。


2

OSXの場合、バイナリはと呼ばれgshufます。

brew install coreutils
gshuf -o File.txt < File.txt

1

もし私のようにあなたがshufmacOSの代わりを探すためにここに来たなら、を使ってくださいrandomize-lines

randomize-lines(homebrew)パッケージをインストールします。これには、rlと同様の機能を持つコマンドがありますshuf

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

0

私はこれを見つけた場所を忘れましたが、これは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;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.