在一组文件中搜索术语

在一组文件中搜索术语

我有两个文件:

files_to_search.out
terms_to_search.out

我想创建一个命令来标识中的terms_to_search.out任何文件中未使用的术语files_to_search.out

是否有捷径可寻?

答案1

快速丑陋的单行尝试(使用 GNU grep 选项-o):

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

答案2

如果您想要考虑可能重叠的术语,这有点棘手,例如,包含的单行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;

相关内容