Mélangez au hasard les lignes dans un grand fichier texte

11

J'ai un fichier texte de ~ 1 Go avec environ 6k lignes (chaque ligne est très longue) et je dois mélanger aléatoirement ses lignes. C'est possible? Peut-être avec awk?

ddmichael
la source

Réponses:

19

Vous pouvez utiliser la shufcommande de GNU coreutils . L'utilitaire est assez rapide et prendrait moins d'une minute pour mélanger un fichier de 1 Go.

La commande ci-dessous pourrait bien fonctionner dans votre cas car shuflira l'entrée complète avant d'ouvrir le fichier de sortie:

$ shuf -o File.txt < File.txt
Suraj Biyani
la source
Merci, j'ai oublié de mentionner que je suis sur OSX, des équivalents?
ddmichael
6
@ddmichael Exécutez brew install coreutilset utilisez /usr/local/bin/gshuf.
Lri
2
@ddmichael Alternativement pour OS X, vous pouvez utiliser ce liner Perl one. Vous avez celui-ci l'un des anciens blogs. A fait un test rapide et a trouvé le travail. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Je suis sûr de la vitesse à laquelle il fonctionnerait
Suraj Biyani
4

Python one-liner:

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

Lit toutes les lignes de l'entrée standard, les mélange sur place, puis les imprime sans ajouter de nouvelle ligne de fin (remarquez ,la fin).

Cristian Ciupitu
la source
2

Pour OSX, le binaire est appelé gshuf.

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

Si, comme moi, vous êtes venu ici pour chercher une alternative à shufmacOS, utilisez-le randomize-lines.

Installez le package randomize-lines(homebrew), qui a une rlcommande qui a des fonctionnalités similaires à 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
la source
0

J'ai oublié où je l'ai trouvé, mais voici ce shuffle.plque j'utilise:

#!/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
la source
0

Au moins dans Ubuntu, il y a un programme appelé shuf

shuf file.txt
Gonzo
la source
Ce programme fait partie des coreutils, comme l'a mentionné Suraj Biyani .
Cristian Ciupitu