これは、ハッシュを使用してfile2の行での反復ごとのO(1)(償却時間)ルックアップのためにfile1から必要なキーのセットを保持するPerlワンライナーです。したがって、O(m + n)時間で実行されます。ここで、mはキーセットの行数、nはテストしているファイルの行数です。
perl -ne'BEGIN{open K,shift@ARGV;chomp(@a=<K>);@hash{@a}=()}m/^(\p{alpha}+)\s/&&exists$hash{$1}&&print' tkeys file2
file2がキーに対して行ごとにテストされている間、キーセットはメモリに保持されます。
Perlの-a
コマンドラインオプションを使用した場合も同じです。
perl -ane'BEGIN{open G,shift@ARGV;chomp(@a=<G>);@h{@a}=();}exists$h{$F[0]}&&print' tkeys file2
2番目のバージョンはおそらく目には少し簡単です。;)
ここで覚えておかなければならないことの1つは、プロセッサバウンドよりもIOバウンドである可能性が高いということです。したがって、目標はIOの使用を最小限に抑えることです。ルックアップキーセット全体が、O(1)の償却ルックアップを提供するハッシュに保持されている場合。このソリューションが他のソリューションよりも優れている点は、一部の(低速の)ソリューションは、file2の各行に対して1回だけキーファイル(file1)を実行する必要があることです。この種のソリューションはO(m * n)になります。ここで、mはキーファイルのサイズ、nはfile2のサイズです。一方、このハッシュアプローチはO(m + n)時間を提供します。それは大きな違いです。キーセットを介した線形検索を排除することでメリットがあり、IOを介してキーを1回だけ読み取ることでさらにメリットがあります。