Bash 仅在10.000中选择5.000个数字的代码

Bash 仅在10.000中选择5.000个数字的代码,bash,awk,Bash,Awk,我想得到一些帮助,在awk中生成一个代码,在10000条记录中随机选择5000条。排序有一个随机化器 假设输入文件名为10k sort -R 10k | head -5000 > 5k # write selections to "5k" 以下方法适用于单行记录和多行记录或具有特定记录分隔符的记录 定义脚本random\u子集.awk # Uniform(m) :: returns a random integer such that # 1 <= Uniform(m) &l

我想得到一些帮助,在awk中生成一个代码,在10000条记录中随机选择5000条。

排序有一个随机化器

假设输入文件名为
10k

sort -R 10k | head -5000 > 5k # write selections to "5k"

以下方法适用于单行记录和多行记录或具有特定记录分隔符的记录

定义脚本
random\u子集.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 -v RS='@' -v ORS='@' -f subset.awk inputfile > outputfile
$ awk -v count=5000 -v RS='' -v ORS='\n\n' -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

有无重复?你尝试了什么?考虑创建一个10000个条目的数组- 0…9999。然后使用Fisher-Yates随机洗牌将数组随机化。然后使用数组中的前5000个条目。关于费舍尔·耶茨的洗牌还有一些问题——即使他们没有使用Awk,也不难翻译成Awk。(例如:有指向有用引用的指针。)如果不重复,请参见为什么使用awk
shuf-n5000 input.txt