Pode haver uma solução mais centrada em shell (awk?), mas eu geralmente recorro a perl
quando o problema se torna complexo. Aqui está um script perl que lê todos os csv2
na memória, coletando as linhas como chaves em um hash cujos valores são os títulos correspondentes.
Em seguida, ele percorre csv1
, extrai o título e, em seguida, para cada título de csv2
, conta o número de vezes que cada palavra no título é vista. Se for mais de desired
, o título correspondente será impresso, juntamente com a linha "source" de csv1
.
#!/usr/bin/env perl
my @csv2 = ();
open CSV2, "<csv2" or die;
@csv2=<CSV2>;
close CSV2;
my %csv2hash = ();
for (@csv2) {
chomp;
my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title
$csv2hash{$_} = $title;
}
open CSV1, "<csv1" or die;
while (<CSV1>) {
chomp;
my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title
my @titlewords = split /\s+/, $title; #/ get words
my $desired = 3;
my $matched = 0;
foreach my $csv2 (keys %csv2hash) {
my $count = 0;
my $value = $csv2hash{$csv2};
foreach my $word (@titlewords) {
++$count if $value =~ /\b$word\b/i;
last if $count >= $desired;
}
if ($count >= $desired) {
print "$csv2\n";
++$matched;
}
}
print "$_\n" if $matched;
}
close CSV1;