Procurando por termos em um conjunto de arquivos

2

Eu tenho dois arquivos:

files_to_search.out
terms_to_search.out

Gostaria de criar um comando que identifique os termos em terms_to_search.out que não são usados em nenhum dos arquivos em files_to_search.out

Existe uma maneira fácil de fazer isso?

    
por Amir Afghani 07.11.2012 / 22:33

2 respostas

1

Isso é um pouco complicado se você quiser considerar os termos que podem se sobrepor, por exemplo, uma única linha contendo banana é suficiente para contar como um uso de ambos os ban e nan .

Aqui está um script perl minimamente testado, rápido e sujo. Ele lê as strings para pesquisar (as agulhas) e os nomes dos arquivos e, em seguida, cria uma expressão regular que corresponde a qualquer uma das agulhas. Quando encontra uma correspondência, ela remove a string correspondente do conjunto de agulhas e recria a regex. As agulhas que sobram no final são as que você procura.

#! /usr/bin/env perl
open FILENAMES, "<", "files_to_search.out" or die $!;
@filenames = <FILENAMES>;
close FILENAMES;
chomp foreach @filenames;
open NEEDLES, "<", "terms_to_search.out" or die $!;
@needles = <NEEDLES>;
close NEEDLES;
chomp foreach @needles;
%needles = map {$_, 1} @needles;
sub build_re {
    $re = qr/(@{[join("|", map quotemeta, keys %needles)]})/;
}
@ARGV = @filenames;
while (<ARGV>) {
    while (/$re/) {
        delete $needles{$1};
        exit if !%needles;
        build_re();
    }
}
print map "$_\n", sort keys %needles;
    
por 08.11.2012 / 00:31
2

rápida e feia tentativa em um liner (com o GNU grep para a opção -o ):

grep -of terms_to_search_out $(cat files_to_search.out | tr '\n' ' ') | sort | uniq | grep  -vf terms_to_search_out 
    
por 07.11.2012 / 22:46

Tags