일련의 단어가 포함된 파일 찾기

일련의 단어가 포함된 파일 찾기

저는 grep을 사용하여 디렉토리에서 단어 세트가 포함된 파일을 찾습니다. 하지만 grep은 이러한 단어가 포함된 줄을 검색합니다. 제가 원하는 것은 grep이 이 단어가 모두 포함된 파일을 다른 줄에도 표시하는 것입니다.

grep -lw "ből\|dének\|jeként\|jében\|jéből\|jéhez\|jének\|jéről\|jét\|jével\|jéül" *model.txt

하지만 파일에 한두 개의 .. 단어가 포함되어 있으면 작동하지 않습니다. 전체 단어 세트를 포함해야 합니다.

Bash를 사용하여 어떻게 이를 달성할 수 있나요?

Tagwint가 제안한 코드를 사용하고 있습니다.

find -name '*model.txt' | while read f; do [[ "$(grep -o -w -f patterns  $f| sort -u|wc -l)" -eq "$(cat patterns | wc -l)" ]] && echo $f; done

각 파일의 발생 횟수를 표시하도록 수정하려면 어떻게 해야 합니까? 좋다..

685 01_táska.model.txt
687 02_dinnye.model.txt
685 03_kapu.model.txt
685 04a_nő.model.txt
685 04b_büdzsé.model.txt

답변1

"더 짧은 솔루션"이란 더 짧은 줄을 의미한다고 생각합니다. 매우 긴 목록을 줄일 수는 없습니다. 그렇죠?

모든 단어를 파일에 넣고 -f grep 옵션을 사용하는 것이 좋습니다. 아래 솔루션은 -o 옵션을 사용하여 일치하는 부분만 제공합니다. 그러면 파일에서 일치하는 모든 단어의 목록이 생성됩니다. 패턴 목록과 정확히 일치하는 항목이 있는 경우 목록을 정렬한 다음 고유화하면 파일에 해당 항목이 모두 포함된다는 의미입니다. wc -l행 수를 계산합니다.

find -name '*model.txt' | while read f; do [[ "$(grep -o -w -f patterns  $f| sort -u|wc -l)" -eq "$(cat patterns | wc -l)" ]] && echo $f; done

패턴은 검색어가 포함된 파일의 이름입니다.

#cat patterns
ből
ből
dének
jeként
....

또한 전체 단어만 일치하는지 확인하는 grep의 -w 옵션에 유의하세요. 그렇지 않으면 "기쁨"과 같은 짜증나는 단어에 대한 계산이 잘못될 수 있습니다.기쁨가득한

물론 이것이 중요하다면 온라인 사용자로부터 더 나은 모습을 얻을 수 있습니다

고쳐 쓰다 스키마 파일에 빈 줄이 없는지 확인하세요.여기에 이미지 설명을 입력하세요.

업데이트 2 스키마 파일에 중복이 없는지 확인하세요. 파티를 망칠 수 있습니다.

업데이트 3

파일 이름 앞에 발생 횟수 카운터를 표시하려면:

 find -name '*model.txt' | while read f; do [[ "$(grep -o -w -f patterns  $f| tee /tmp/$f |sort -u|wc -l)" -eq "$(cat patterns | wc -l)" ]] && echo $(cat /tmp/$f|wc -l) $f ; rm /tmp/$f; done

아이디어는 모든 일치 항목을 즉시 임시 파일에 저장하고 정렬/고유하기 전에 개수를 계산하는 것입니다. tmp 파일을 청소하는 것은 예의를 위한 것입니다.

답변2

이것은 본 단어를 기억하고 필요한 모든 단어가 포함된 파일 이름을 인쇄하는 awk 스크립트입니다.

awk -v required_words='ből dének jeként jében jéből jéhez jének jéről jét jével jéül' '
    function check() {
        for (w in seen) if (!seen[w]) return;
        print last_file;
    }
    BEGIN {
        split(required_words, a);
        for (i in a) seen[a[i]] = 0;
    }
    NR==1 { last_file = FILENAME; }
    FNR==1 && NR!=1 { check(); for (w in seen) seen[w] = 0; }
    END { check() }
    { split($0, a, /[^[:alpha:]]+/);
      for (i in a) if (a[i] in seen) seen[a[i]]=1; }
' *model.txt

관련 정보