Pegue uma amostra de um arquivo ou fluxo?

3

Existem utilitários para filtrar uma amostra de um fluxo na linha de comando, por exemplo

  • imprima a cada 100 linhas de um arquivo ou
  • imprime uma linha de um arquivo com probabilidade de 0,01 ou
  • por meio de algoritmos como amostragem de reservatório ?

Atualização: até agora eu encontrei:

  • imprima a cada 100 linhas de um arquivo: sed -n '0~100p'
por miku 12.08.2016 / 09:57

2 respostas

4

As soluções simples com o awk (GNU):

Cada um em 100 (linhas com o número divisível por 100):

do_something | awk 'NR % 100 == 0'

ou pseudoaleatoriamente:

do_something | awk 'rand() < 0.01' 

Os números provavelmente não serão exatamente uniformes e pode ser necessário adicionar BEGIN{ srand() } para inicializar uma nova semente para cada execução.

    
por 12.08.2016 / 10:19
3

Se você tem o GNU sort em sua máquina, que suporta -R ( --random-sort ), você poderia apenas

$ sort -R myfile | head -n 1000

Para obter 1000 linhas aleatórias do arquivo. Não funciona em fluxos, pois sort precisa ler a entrada completa para fazer qualquer coisa.

    
por 12.08.2016 / 10:26