Следующий метод работает как для отдельных, так и для многострочных записей или записей с определенными разделителями записей.
Определить скрипт 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