Como eu classifico aleatoriamente grupos de múltiplas linhas em um arquivo multi-GB?

4

Eu tenho um arquivo multi-GB que tem elementos em 4 linhas, e eu gostaria de ter todas as 4 linhas randomizadas em outro arquivo, isto é, manter cada uma das quatro linhas agrupadas e randomizar esses conjuntos. Existe uma maneira fácil de fazer isso?

    
por 719016 01.07.2011 / 12:56

2 respostas

4

Se você estiver usando uma nova distribuição linux / unix razoável, sort é fornecido com um -R flag que randomiza as linhas em vez de classificá-las. Podemos usar isso para criar essa solução de uma linha:

awk '{printf("%s%s",$0,(NR%4==0)?"\n":"
awk '{printf("%s%s",$0,(NR%4==0)?"\n":"%pre%")}' file.txt | sort -R | tr "%pre%" "\n" > sorted.txt
")}' file.txt | sort -R | tr "%pre%" "\n" > sorted.txt

Primeiro, use awk para agrupar a cada 4 linhas substituindo \n por sort -R . Em seguida, misturamos as linhas usando tr e finalmente restauramos as quebras de linha com %code% .

    
por 26.08.2011 / 18:42
1

Isso é em Python. Tenho certeza que alguém vai postar uma resposta Perl também. ; -)

#!/usr/bin/python

import random

#Change these to the desired files
infile = "/path/to/input/file"
outfile = "/path/to/output/file"

fh = file(infile)
contents = fh.readlines()
fh.close()

chunked = [contents[i:i+4] for i in xrange(0, len(contents), 4)]
random.shuffle(chunked)

fh = file(outfile, 'w')

for chunk in chunked:
    for line in chunk:
        fh.write(line)

fh.close()

Programador da IANA para que alguém possa melhorar isso, mas eu testei e funciona muito bem.

    
por 01.07.2011 / 14:53

Tags