Random 从带有awk代码的文件中随机选择3000行

Random 从带有awk代码的文件中随机选择3000行,random,awk,lines,Random,Awk,Lines,我想从包含8000行的sample.file中随机选择3000行。 我将使用awk代码或从命令行执行此操作。我该怎么做 在PowerShell中: Get-Content myfile | Get-Random -Count 3000 或更短: gc myfile | random -c 3000 您可以结合使用awk、sort、head/tail和sed来执行此操作,例如: pax$ seq 1 100 | awk ' ...$ BEGIN {srand()} ...$

我想从包含8000行的sample.file中随机选择3000行。 我将使用awk代码或从命令行执行此操作。我该怎么做

在PowerShell中:

Get-Content myfile | Get-Random -Count 3000
或更短:

gc myfile | random -c 3000

您可以结合使用
awk
sort
head/tail
sed
来执行此操作,例如:

pax$ seq 1 100 | awk '
...$    BEGIN {srand()}
...$          {print rand() " " $0}
...$ ' | sort | head -5 | sed 's/[^ ]* //'
57
25
80
51
72
如您所见,它从
seq 1100
中生成的一百行中随机选择五行

awk
技巧在文件中的每一行前面加上格式为
“0.237788”
的随机数和空格,然后排序(显然)根据该随机数对其进行排序

然后使用
head
(如果没有
head
,则使用
tail
)获取第一行(或最后一行)
N

最后,
sed
将去掉随机数和空格以及每行的开头

对于您的具体情况,您可以使用以下内容(在一行上):


根据Glenn的评论修复:

awk 'BEGIN {
  a=8000; l=3000
  srand(); nr[x]
  while (length(nr) <= l) 
    nr[int(rand() * a) +  1]    
  }
NR in nr
  ' infile 
awk'开始{
a=8000;l=3000
srand();nr[x]
while(长度(nr)
awk'开始{srand();}
{a[NR]=$0}

END{for(i=1;i如果您只需要大约3000行,这是一种简单的方法:

awk -v N=`cat FILE | wc -l` 'rand()<3000/N' FILE

awk-vn=`cat FILE | wc-l`'rand()我使用了这些命令,得到了我想要的:

awk 'BEGIN {srand()} {print rand() " " $0}' examples/data_text.txt | sort -n | tail -n 80 | awk '{printf "%1d %s %s\n",$2, $3, $4}' > examples/crossval.txt

事实上,它从输入文件中随机选择了80行。

对于一个我不想乱洗的大文件,这很好而且很快:

sed-u-n'l1p;l2p;…;l1000p;l1000q'


-u选项减少了缓冲,并且l1、l2、…l1000是从R中获得的随机和排序的行号(与python或perl一样好)。

如果您有gnu排序,则很容易:

sort -R FILE | head -n3000
如果你有gnu shuf,那就更容易了:

shuf -n3000 FILE

+1,回答很好。在BEGIN块中,填充
nr
数组后,您可能需要检查其大小,以确保有3000个不同的数字。@Glenn,非常正确:)谢谢,已修复。此答案与
排序
/
shuf
答案的不同之处在于,记录的显示顺序始终与它们在原始文件中的显示顺序相同。这可能与您有关,也可能与您无关。谢谢!很高兴知道shuf是专门为此任务编写的。回答很好。如果您需要选择较大的数字,请选择从较短列表/样本中随机选择的ber您可能需要
-r
选项来启用替换。例如
shuf-n5000-r list-of-15-choices.txt
sort -R FILE | head -n3000
shuf -n3000 FILE