Theo dõi trên this câu hỏi, tôi cần có chính xác n
dòng ngẫu nhiên trong một tệp (hoặc stdin
). Điều này sẽ tương tự như head
hoặc tail
, ngoại trừ tôi muốn một số từ giữa.Làm thế nào tôi có thể nhận được chính xác n dòng ngẫu nhiên từ một tệp với Perl?
Bây giờ, ngoài việc lặp lại tệp với các giải pháp cho câu hỏi được liên kết, cách tốt nhất để có được chính xác n
dòng trong một lần chạy là gì?
Để tham khảo, tôi đã cố gắng này:
#!/usr/bin/perl -w
use strict;
my $ratio = shift;
print $ratio, "\n";
while() {
print if ((int rand $ratio) == 1);
}
nơi $ratio
là tỷ lệ thô của dòng tôi muốn. Ví dụ, nếu tôi muốn 1 trong 10 dòng:
random_select 10 a.list
Tuy nhiên, điều này không cung cấp cho tôi một số tiền chính xác:
aaa> foreach i (0 1 2 3 4 5 6 7 8 9)
foreach? random_select 10 a.list | wc -l
foreach? end
4739
4865
4739
4889
4934
4809
4712
4842
4814
4817
Ý nghĩ khác tôi đã được slurping tập tin đầu vào và sau đó chọn n
ngẫu nhiên từ mảng, nhưng đó là một vấn đề nếu tôi có một tập tin thực sự lớn.
Bất kỳ ý tưởng nào?
Chỉnh sửa: Đây là bản sao chính xác của câu hỏi this.
Đó không phải là một bản sao chính xác của http://stackoverflow.com/questions/692312/randomly-pick-lines-from-a-file-without-slurping-it-with-unix –
có nó Là. Lấy làm tiếc. Tôi sẽ liên kết hai và bỏ phiếu để đóng nó lại. –
không, câu hỏi khác cho phép mẫu bị tắt - mẫu này muốn có số chính xác. – Alnitak