Losowo losuj wiersze w dużym pliku tekstowym

11

Mam plik tekstowy o wielkości ~ 1 GB z około 6 tys. Wierszy (każdy wiersz jest bardzo długi) i muszę losowo tasować jego wiersze. Czy to możliwe? Być może z awk?

ddmichael
źródło

Odpowiedzi:

19

Możesz użyć shufpolecenia z GNU coreutils . Narzędzie jest dość szybkie i przetasowanie pliku 1 GB zajmuje mniej niż minutę.

Poniższe polecenie może po prostu działać w twoim przypadku, ponieważ shufodczyta pełne dane wejściowe przed otwarciem pliku wyjściowego:

$ shuf -o File.txt < File.txt
Suraj Biyani
źródło
Dzięki, zapomniałem wspomnieć, że jestem na OSX, jakieś odpowiedniki?
ddmichael
6
@ddmichael Uruchom brew install coreutilsi użyj /usr/local/bin/gshuf.
Lri
2
@ddmichael Alternatywnie dla OS X możesz użyć tego linera Perl. Mam ten jeden ze starych blogów. Zrobiłem szybki test i stwierdziłem, że działa. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Jestem jednak pewien, jak szybko by to działało
Suraj Biyani
4

Python one-liner:

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

Odczytuje wszystkie wiersze ze standardowego wejścia, tasuje je w miejscu, a następnie drukuje bez dodawania końcowej nowej linii (zwróć uwagę ,na koniec).

Cristian Ciupitu
źródło
2

W OSX nazywa się plik binarny gshuf.

brew install coreutils
gshuf -o File.txt < File.txt
ishandutta2007
źródło
1

Jeśli tak jak ja, przyszedłeś tu poszukać alternatywy shufdla MacOS, a następnie użyj randomize-lines.

Zainstaluj randomize-linespakiet (homebrew), który ma rlpolecenie o podobnej funkcjonalności 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
źródło
0

Zapomniałem, gdzie to znalazłem, ale oto shuffle.pl, czego używam:

#!/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
źródło
0

Przynajmniej w Ubuntu istnieje program o nazwie shuf

shuf file.txt
Gonzo
źródło
Ten program jest częścią coreutils, jak wspomniał Suraj Biyani .
Cristian Ciupitu