Com a implementação GNU do comando split
:
split -l 4 --filter='shuf -n1' inputfile
-
-l N
- coloqueN
linhas / registros por arquivo de saída -
--filter=COMMAND
- escreve para o shellCOMMAND
; nome do arquivo é$FILE
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.
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
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.
Tags text-processing awk sed shuf