一連の単語を含むファイルを探す

一連の単語を含むファイルを探す

私は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

しかし、ファイルに1つまたは2つの..単語が含まれている場合は機能しません。完全な単語セットを含める必要があります。

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

関連情報