Com o GNU sort
, para 1 como o máximo:
sort -R file | sort -uk2,2
Para valores arbitrários como o máximo:
sort -R file | awk -v max=2 '++count[$2] <= max' | head -n 8
Eu tenho um arquivo de entrada do qual eu quero escolher aleatoriamente uma linha. Em uma coluna em cada linha é um valor, e eu quero apenas um número de linhas até uma contagem máxima deste valor a ser escolhido aleatoriamente, não mais.
Então, por simplicidade, comecei com um arquivo de teste assim:
1 1
2 1
3 1
4 1
5 2
6 2
7 3
8 4
9 4
10 4
11 5
12 5
13 5
14 5
15 5
16 6
17 6
18 7
19 8
20 8
Agora quero escolher linhas aleatoriamente, mas apenas um máximo de, por exemplo, 1 linha por valor na coluna 2:
1 1
6 2
7 3
9 4
13 5
17 6
18 7
19 8
Este é o código que escrevi para escolher linhas até uma contagem máxima:
#!/bin/bash
for ((i>0;i<8;i++))
do
gawk -v i="${i}" 'BEGIN{n=1} {if (i==$2 && n<=1) {n++;print $0;} if (n>1){next}} ' input >> output
done
Como posso estender isso para escolher linhas aleatórias até o máximo?
Com o GNU sort
, para 1 como o máximo:
sort -R file | sort -uk2,2
Para valores arbitrários como o máximo:
sort -R file | awk -v max=2 '++count[$2] <= max' | head -n 8
Tags text-processing scripting gawk