Imprime linhas aleatórias de arquivo, mas com contagem máxima de um determinado valor

2

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?

    
por quadrupoltensor 25.04.2018 / 13:22

1 resposta

2

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
    
por 25.04.2018 / 14:18