in reply to Pattern matching across two files, Need something better than grep -f!
NOTE:The following code assumes that the whitespace in both files consists of single tabs.
Assuming the patterns file has less than say 15 million records, this should process the entire data file in less than 5 minutes:
#! perl -slw use strict; my %patterns; open PAT, '<', 'patterns.txt' or die $!; chomp, undef $patterns{ $_ } while <PAT>; close PAT; open DAT, '<', 'data' or die $!; while( <DAT> ) { my( $key, $v1, $v2 ) = m[(\S+\s+\S+)\s+(\S+)\s+(\S+)]; exists $patterns{ $key } and print "$key\t$v2"; } close DAT;
If the pattern file is a lot bigger than that -- ie. too big to build the hash in your memory -- then you would need to run multiple passes.
If you are seeking to reduce the time to much less than the above code takes, you'll need to look at parallelising the operation.
|
|---|