Em um script Bash, desejo selecionar N linhas aleatórias do arquivo de entrada e saída para outro arquivo.
Como isso pode ser feito?
bash
shell
random
text-processing
user121196
fonte
fonte
sort -R
, pois faz muito trabalho em excesso, principalmente para arquivos longos. Você pode usar$RANDOM
,% wc -l
,jot
,sed -n
(à la stackoverflow.com/a/6022431/563329 ), e funcionalidade bash (matrizes, redirecionamentos de comando, etc) para definir a sua própriapeek
função que irão correr em arquivos 5.000.000 linhas.Respostas:
Use
shuf
com a-n
opção como mostrado abaixo, para obterN
linhas aleatórias:fonte
sort -R
?Classifique o arquivo aleatoriamente e escolha as primeiras
100
linhas:fonte
sort
na verdade classifica linhas idênticas, portanto, se você tiver linhas duplicadas e tivershuf
(uma ferramenta gnu) instalada, é melhor usá-las para isso.shuf -n
age instantaneamente.sort -R
provavelmente é a opção GNU, instale o GNU coreutils. btw,shuf
também faz parte do coreutils.sort -R input | head -n <num_lines>
. O arquivo de entrada tinha 279GB, com 2bi + linhas. Não é possível compartilhar. De qualquer forma, o ponto é que você pode manter algumas linhas na memória com shuffle para fazer a seleção aleatória do que deve ser produzido. A classificação classificará o arquivo inteiro , independentemente de quais sejam suas necessidades.Bem De acordo com um comentário sobre a resposta shuf, ele embaralhou 78 000 000 000 linhas em menos de um minuto.
Desafio aceito...
EDIT: Eu bati meu próprio recorde
powershuf fez isso em 0,047 segundos
O motivo é tão rápido, bem, eu não leio o arquivo inteiro e apenas movo o ponteiro do arquivo 10 vezes e imprimo a linha após o ponteiro.
Repositório Gitlab
Tentativa antiga
Primeiro eu precisava de um arquivo de 78.000.000.000 linhas:
Isso me dá um arquivo com 78 bilhões de novas linhas ;-)
Agora, para a parte shuf:
O gargalo era a CPU e não usava vários encadeamentos; fixou 1 núcleo em 100% e os outros 15 não foram usados.
Python é o que eu uso regularmente, e é isso que vou usar para tornar isso mais rápido:
Isso me deixou em menos de um minuto:
Eu fiz isso em um Lenovo X1 extremo de segunda geração com o i9 e o Samsung NVMe, o que me proporciona muita velocidade de leitura e gravação.
Eu sei que pode ficar mais rápido, mas vou deixar um espaço para tentar outros.
Fonte do contador de linhas : Luther Blissett
fonte