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?

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

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).


2

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

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

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

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;
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.