查找包含一组单词的文件

查找包含一组单词的文件

我正在使用 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

Patterns 是包含搜索词的文件的名称:

#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

相关内容