Код для выбора 5.000 номеров в 10.000 случайно - PullRequest
0 голосов
/ 01 мая 2019

Мне нужна помощь в создании кода в awk, который из 10000 записей будет случайным образом выбирать 5000.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Сортировка имеет рандомизатор.

Предполагая, что имя файла ввода 10k,

sort -R 10k | head -5000 > 5k # write selections to "5k"
0 голосов
/ 02 мая 2019

Следующий метод работает как для отдельных, так и для многострочных записей или записей с определенными разделителями записей.

Определить скрипт random_subset.awk

# Uniform(m) :: returns a random integer such that
#    1 <= Uniform(m) <= m
function Uniform(m) { return 1+int(m * rand()) }

# KnuthShuffle(m) :: creates a random permutation of the range [1,m]
function KnuthShuffle(m,   i,j,k) {
    for (i = 1; i <= m  ; i++) { permutation[i] = i }
    for (i = 1; i <= m-1; i++) {
        j = Uniform(i-1)
        k = permutation[i]
        permutation[i] = permutation[j]
        permutation[j] = k
    }
}

BEGIN{ srand() }
{a[NR]=$0}
END{ KnuthShuffle(NR); for(r = 1; r <= count; r++) print a[permutation[r]] }

Тогда вы можете запустить его как:

$ awk -v count=5000 -f subset.awk inputfile > outputfile

Или, если у вас есть файл, в котором разделитель записей задается таким символом, как @, вы можете сделать:

$ awk -v count=5000 -v RS='@' -v ORS='@' -f subset.awk inputfile > outputfile

Если вы хотите выбрать случайные абзацы, вы можете сделать:

$ awk -v count=5000 -v RS='' -v ORS='\n\n' -f subset.awk inputfile > outputfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...