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

时间:2011-09-22 12:43:50

标签: random awk lines

我想从sample.file中随机选择3000行,其中包含8000行。 我将使用awk代码或从命令行执行此操作。我怎样才能做到这一点?

8 个答案:

答案 0 :(得分:9)

如果你有gnu排序,那很简单:

sort -R FILE | head -n3000

如果你有gnu shuf,那就更容易了:

shuf -n3000 FILE

答案 1 :(得分:4)

awk 'BEGIN{srand();}
{a[NR]=$0}
END{for(i=1; i<=3000; i++){x=int(rand()*NR) + 1; print a[x];}}' yourFile

答案 2 :(得分:3)

根据格伦的评论修正:

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

P.S。将数组传递给长度内置函数是不可移植的,您已被警告:)

答案 3 :(得分:2)

您可以结合使用awksorthead/tailsed来执行此操作,例如:

pax$ seq 1 100 | awk '
...$    BEGIN {srand()}
...$          {print rand() " " $0}
...$ ' | sort | head -5 | sed 's/[^ ]* //'
57
25
80
51
72

,正如您所看到的,从seq 1 100中生成的一百个中选择五个随机行。

awk技巧为文件中的每一行添加格式"0.237788 "的随机数和空格,然后排序(显然)根据该随机数对其进行排序。

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

最后,sed将删除随机数和空格以及每行的开头。

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

awk 'BEGIN {srand()} {print rand() " " $0}' file8000.txt
    | sort
    | tail -3000
    | sed 's/[^ ]* //'
    >file3000.txt

答案 4 :(得分:1)

我使用了这些命令,得到了我想要的东西:

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行。

答案 5 :(得分:0)

在PowerShell中:

Get-Content myfile | Get-Random -Count 3000

或更短:

gc myfile | random -c 3000

答案 6 :(得分:0)

如果您只需要大约3000行,这是一种简单的方法:

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

反引号(`)之间的部分给出了文件中的行数。

答案 7 :(得分:0)

对于一个我不想改组的大文件,这个方法运行良好而且非常快:

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

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