Come faccio a ordinare casualmente gruppi di più righe in un file multi-GB?


4

Ho un file multi-GB che ha elementi in 4 righe e vorrei che ogni 4 righe fossero casuali in un altro file, cioè mantenendo ogni quattro righe raggruppate e randomizzando quei set. C'è un modo semplice per farlo?


1
Vuoi mantenere le quattro linee raggruppate e randomizzare quei set, o vuoi randomizzare le quattro linee ma mantenere i gruppi in ordine?
Patch

tenere raggruppati tutti i gruppi di quattro righe
719016,

Risposte:


4

Se stai usando una nuova distribuzione linux / unix ragionevole, sortviene fornito con un -Rflag che randomizza le linee invece di ordinarle. Possiamo usarlo per creare questa soluzione one-liner:

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

In primo luogo, utilizzare awkper raggruppare ogni 4 righe sostituendo \ncon \0. Quindi mescoliamo le linee usando sort -Re infine ripristiniamo le interruzioni di linea con tr.


Non "\nè chiuso e dovrebbe essere "\n". Non posso fare una modifica così piccola, quindi la sto solo mettendo qui.
Ian Hunter,

Inoltre, per qualche motivo sul mio sistema, non sono riuscito a stampare "\ 0" e farlo sostituire correttamente. Invece, ho usato printf("%s%c",$0,(NR%4==0)?"\n":0). Non avevo bisogno di cambiare il comando tr.
Ian Hunter,

1

Questo è in Python. Sono sicuro che qualcuno pubblicherà anche una risposta Perl. ;-)

#! / Usr / bin / python

importazione casuale

#Cambia questi nei file desiderati
infile = "/ percorso / 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')

per pezzo in pezzi:
    per linea in blocco:
        fh.write (line)

fh.close ()

Programmatore IANA quindi qualcuno potrebbe probabilmente migliorarlo, ma l'ho testato e funziona perfettamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.