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?
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?
Risposte:
Se stai usando una nuova distribuzione linux / unix ragionevole, sort
viene fornito con un -R
flag 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 awk
per raggruppare ogni 4 righe sostituendo \n
con \0
. Quindi mescoliamo le linee usando sort -R
e infine ripristiniamo le interruzioni di linea con tr
.
"\n
è chiuso e dovrebbe essere "\n"
. Non posso fare una modifica così piccola, quindi la sto solo mettendo qui.
printf("%s%c",$0,(NR%4==0)?"\n":0)
. Non avevo bisogno di cambiare il comando tr.
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.