ファイルセットから用語を検索する

ファイルセットから用語を検索する

2つのファイルがあります。

files_to_search.out
terms_to_search.out

terms_to_search.outすべてのファイルで使用されていない用語を識別するコマンドを作成したいと思います。files_to_search.out

見つけることができるショートカットがありますか?

答え1

高速で醜い1行の試み(GNU grep optionsを使用-o):

grep -of terms_to_search_out $(cat files_to_search.out | tr '\n' ' ') | sort | uniq | grep  -vf terms_to_search_out 

答え2

潜在的に重複する用語(たとえば、andの使用と見なされるのにbanana十分に含まれている単一行)を説明する場合は、これは少し面倒です。bannan

これは最小限のテストを経た高速で汚れたPerlスクリプトです。検索する文字列(ピン)とファイル名を読み取り、すべてのピンに一致する正規表現を作成します。一致するものが見つかったら、針セットから一致する文字列を削除し、正規表現を再構築します。最後の残りの針があなたが探している針です。

#! /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;

関連情報