두 개의 파일이 있습니다.
files_to_search.out
terms_to_search.out
terms_to_search.out
모든 파일에서 사용되지 않는 용어를 식별하는 명령을 만들고 싶습니다 .files_to_search.out
찾을 수 있는 단축키가 있나요?
답변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;