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, 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.
"\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.