代码以10.000 randrand的形式选择5.000个数字

时间:2019-04-30 22:56:49

标签: bash awk

我想要一些帮助以awk编写代码,以便在10,000条记录中随机选择5,000条。

2 个答案:

答案 0 :(得分:1)

排序有一个随机数。

假设输入文件名为10k

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

答案 1 :(得分:0)

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

定义脚本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