Mische zufällig Zeilen in einer großen Textdatei

11

Ich habe eine Textdatei von ~ 1 GB mit ungefähr 6.000 Zeilen (jede Zeile ist sehr lang) und ich muss ihre Zeilen zufällig mischen. Ist es möglich? Möglicherweise mit awk?

ddmichael
quelle

Antworten:

19

Sie können den shufBefehl von GNU coreutils verwenden . Das Dienstprogramm ist ziemlich schnell und würde weniger als eine Minute dauern, um eine 1-GB-Datei zu mischen.

Der folgende Befehl funktioniert möglicherweise nur in Ihrem Fall, da shufdie vollständige Eingabe vor dem Öffnen der Ausgabedatei gelesen wird:

$ shuf -o File.txt < File.txt
Suraj Biyani
quelle
Danke, ich habe vergessen zu erwähnen, dass ich unter OSX bin.
Ddmichael
6
@ddmichael Ausführen brew install coreutilsund verwenden /usr/local/bin/gshuf.
Lri
2
@ddmichael Alternativ für OS X können Sie diesen Perl One Liner verwenden. Habe diesen einen der alten Blogs. Habe einen kurzen Test gemacht und festgestellt, dass es funktioniert. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Ich bin mir sicher, wie schnell es laufen würde
Suraj Biyani
4

Python-Einzeiler:

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

Liest alle Zeilen von der Standardeingabe, mischt sie an Ort und Stelle und druckt sie dann aus, ohne eine abschließende neue Zeile hinzuzufügen (beachten Sie die ,vom Ende).

Cristian Ciupitu
quelle
2

Für OSX wird die Binärdatei aufgerufen gshuf.

brew install coreutils
gshuf -o File.txt < File.txt
ishandutta2007
quelle
1

Wenn Sie wie ich hierher gekommen sind, um nach einer Alternative zu shufmacOS zu suchen, dann verwenden Sie randomize-lines.

Installieren Sie das randomize-lines(Homebrew-) Paket, das einen rlBefehl mit ähnlichen Funktionen wie hat 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
Ahmad Awais
quelle
0

Ich habe vergessen, wo ich das gefunden habe, aber hier ist das shuffle.pl, was ich benutze:

#!/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;
}
Icydog
quelle
0

Zumindest in Ubuntu gibt es ein Programm namens shuf

shuf file.txt
Gonzo
quelle
Dieses Programm ist Teil von Coreutils, wie von Suraj Biyani erwähnt .
Cristian Ciupitu