Awk 文件行信誉的变化

Awk 文件行信誉的变化,awk,Awk,我有一份档案 4 5 6 6 1 7 5 5 7 0 2 1 7 8 0 6 我想从这个有声望的文件中随机选择行来生成文件。例如,输出可以是: 4 5 6 6 1 7 5 5 1 7 5 5 7 8 0 6 7 8 0 6 1 7 5 5 1 7 5 5 7 8 0 6 我的意思是,一些行将在输出中出现更多次,一些行出现零次。是否有可能生成一个具有信誉的随机数列表,并根据它从输入中选择行?这在awk中是可能的还是其他语言更合适?我不理解声誉的概念,但这里有一种使用随机性的方法: $

我有一份档案

4 5 6 6
1 7 5 5 
7 0 2 1
7 8 0 6
我想从这个有声望的文件中随机选择行来生成文件。例如,输出可以是:

4 5 6 6
1 7 5 5 
1 7 5 5
7 8 0 6


7 8 0 6
1 7 5 5 
1 7 5 5
7 8 0 6

我的意思是,一些行将在输出中出现更多次,一些行出现零次。是否有可能生成一个具有信誉的随机数列表,并根据它从输入中选择行?这在awk中是可能的还是其他语言更合适?

我不理解声誉的概念,但这里有一种使用随机性的方法:

$ awk -v seed=$RANDOM '{           # set the random seed externally
    a[NR]=$0                       # hash records to a
}
END {
    srand(seed)
    for(i=1;i<=4;i++)              # 4 is the number of records to output
        print a[int(1+rand()*NR)]  # get a random array element and output it
}' file

您也可以使用coreutils shuf和sed来执行此操作,例如:

n=$(wc -l < infile)
shuf -n $n -i 1-$n -r | sed 's/$/p/' | sed -nf - infile

如果这不是您所需要的全部:

$ shuf -n $(wc -l < file) -r file
4 5 6 6
7 8 0 6
1 7 5 5
1 7 5 5

然后编辑你的问题以澄清你的要求。

你的意思是重复?还是排列?是的,这是可能的。我的意思是我有一个有20行的文件,我想选择20行,其中一些行会出现更多次,一些行会出现零次。我试图生成一个从0到64的随机数awk'BEGIN{srand;printf%d\n,rand*65}我需要65个数字,所以我应该使用一个循环吗?应该有64个什么决定哪些行应该更频繁地出现,哪些行根本不应该出现?所以这不是一个加权分布,就像你使用声誉这样的术语所建议的那样,如果分数越高,被选中的概率就越高?非常感谢,-v是什么意思?man gawk:在程序开始执行之前,将值val赋给变量var。这些变量值可用于AWK程序的开始规则。我们将一个随机值从shell$random设置为variable seed,并将其用作rand的种子,这是一个很好的做法,否则会使用时间,并在同一秒内生成相同的种子。阅读更多关于实现的信息。@LukášAltman您确实了解,使用这种方法,输出中可能没有重复的行,并且输出中可能存在所有行。我假设硬编码的循环中的4应该是NR,对吗?我的意思是,输出可能只是输入的一个副本。当你说我有一个20行的文件,我想选择20行,其中一些会出现更多次,而另一些会出现零次,这就是你想要的吗?@EdMorton我对需要20行的记录数有点困惑?65? 所以我把4放在那里,而不是NR,以强调在需要时在哪里修改它。你知道,如果把它记录在案,那就太清楚了…:非常感谢谢谢,这是我的荣幸。请问这是什么意思-$wc-l<文件?你的解决方案和@James Brown的解决方案有什么不同吗?不客气。$。。。正在告诉shell执行命令。wc是命令,请参见man wc。它获取输入文件中的行数。请查看shuf的手册页,了解我的代码将执行什么操作,然后阅读James代码,如果您仍然不知道它们执行什么操作,请告诉我。结果将是相似的,不是吗?是的,它们将执行。这只是一种更简单、更有效的方式来完成James awk脚本所做的事情。非常感谢
4 5 6 6
4 5 6 6
1 7 5 5
1 7 5 5
$ shuf -n $(wc -l < file) -r file
4 5 6 6
7 8 0 6
1 7 5 5
1 7 5 5