我有两个文件:
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;