我想从sample.file中随机选择3000行,其中包含8000行。 我将使用awk代码或从命令行执行此操作。我怎样才能做到这一点?
答案 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)
您可以结合使用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 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一样好。)