Selecione aleatoriamente uma linha em cada bloco de N linhas [duplicado]

2

Eu gostaria de selecionar aleatoriamente uma linha após um determinado número de linhas. Por exemplo, aqui está minha entrada:

8 blue
8 red
8 yellow
8 orange
3 pink
3 white
3 cyan
3 purple
1 magenta
1 black
1 green
1 brown

e com a seleção aleatória uma linha de cada quatro linhas, minha saída seria:

8 orange
3 pink
1 green

O melhor que eu tenho é:

awk '!(NR%4){a=NR+4};NR<=a|"shuf -n 1"'

mas não funciona.

    
por mtherk16 17.11.2017 / 13:32

2 respostas

4

Com a implementação GNU do comando split :

split -l 4 --filter='shuf -n1' inputfile
  • -l N - coloque N linhas / registros por arquivo de saída
  • --filter=COMMAND - escreve para o shell COMMAND ; nome do arquivo é $FILE
por 17.11.2017 / 14:05
2

Para selecionar p = 1 linha de cada n = 4 linhas aleatoriamente:

awk -v n=1000 -v p=50 '
  BEGIN {srand(); remaining = p}
  NR > n {remaining = p; NR = 1}
  rand()*(n + 1 - NR) < remaining {
    print; remaining--
  }' < your-file

Para que awk invoque o GNU shuf a cada 4 linhas, você precisaria:

awk -v cmd="shuf -n 1" '{print | cmd}; NR % 4 == 0 {close(cmd)}'

Mas isso significa executar um comando sh e um shuf a cada 4 linhas do arquivo, o que é muito menos eficiente.

    
por 17.11.2017 / 14:58