2012-02-12 11 views
102

in script bash Voglio selezionare N righe casuali dal file di input e l'output in un altro file. come si può fare?Seleziona righe casuali da un file in bash

+0

Ordina il file in modo casuale e raccogliere N prime righe. –

+0

Vedere anche http://stackoverflow.com/questions/12354659/how-to-select-random-lines-from-a-file. –

+8

questo non è un duplicato - vuole N linee vs 1 linea. – OneSolitaryNoob

risposta

134

ordinare i file in modo casuale e prima scelta 100 linee:

$ sort -R input | head -n 100 >output 
+38

'sort' ordina effettivamente le linee identiche insieme, quindi se potresti avere linee duplicate e tu avere 'shuf' (uno strumento gnu) installato, è meglio usarlo per questo. – Kevin

+18

Andalso, questo sicuramente ti farà aspettare ** molto ** se hai un file considerevolmente grande - 80kk linee -, mentre, 'shuf -n' agisce abbastanza istantaneamente. – Rubens

+26

sort -R non è disponibile in Mac OS X (10.9) – tfb785

316

Utilizzare shuf con l'opzione -n come illustrato di seguito, per ottenere N linee casuali:

shuf -n N input > output 
+26

Questa dovrebbe essere la risposta accettata. Wow, shuf è così veloce. - Il prelievo di 10000 righe casuali da un file di testo con 40000 linee è istantaneo.Cercando di usare 'sort -R' mi ci è voluto così tanto che ho appena CTRL-C it – carpii

+1

Se hai solo bisogno di un insieme casuale di linee, non in un ordine casuale, shuf è molto inefficiente (per file di grandi dimensioni): meglio è fare il reservoir campionamento, come in [questa risposta] (https://stackoverflow.com/a/692401/933228). – petrelharp

+3

né shuf né sort -R sono disponibili per mac OSX. eventuali suggerimenti? –

Problemi correlati