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
十分に含まれている単一行)を説明する場合は、これは少し面倒です。ban
nan
これは最小限のテストを経た高速で汚れた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;