В ответ на этот вопрос мне нужно получить ровно n
строк в произвольном порядке из файла (или stdin
). Это будет похоже на head
или tail
, за исключением того, что я хочу немного из середины.
Теперь, кроме перебора файла с решениями связанного вопроса, как лучше всего получить ровно n
строк за один прогон?
Для справки, я попробовал это:
#!/usr/bin/perl -w
use strict;
my $ratio = shift;
print $ratio, "\n";
while () {
print if ((int rand $ratio) == 1);
}
где $ratio
- приблизительный процент строк, которые я хочу. Например, если я хочу 1 в 10 строках:
random_select 10 a.list
Однако, это не дает мне точную сумму:
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
Еще одна мысль, которая у меня возникла, - это хлюпать входной файл, а затем произвольно выбирать n
из массива, но это проблема, если у меня действительно большой файл.
Есть идеи?
Редактировать: Это точная копия этого вопроса.