Random 从带有awk代码的文件中随机选择3000行
我想从包含8000行的sample.file中随机选择3000行。 我将使用awk代码或从命令行执行此操作。我该怎么做 在PowerShell中: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()} ...$
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