この質問のフォローアップn
として、ファイル(またはstdin
)からランダムに正確に行を取得する必要があります。head
これはまたはに似ていますtail
が、真ん中からいくつか欲しい点が異なります。
リンクされた質問の解決策を含むファイルをループする以外にn
、1回の実行で正確に行を取得するための最良の方法は何ですか?
参考までに、私はこれを試しました:
#!/usr/bin/perl -w
use strict;
my $ratio = shift;
print $ratio, "\n";
while () {
print if ((int rand $ratio) == 1);
}
ここ$ratio
で、必要な行の大まかなパーセンテージを示します。たとえば、10行に1行が必要な場合:
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
私が持っていたもう1つの考えは、入力ファイルを丸呑みしてn
から、配列からランダムに選択することでしたが、非常に大きなファイルがある場合は問題になります。
何か案は?
編集:これはこの質問の正確な複製です。