【问题标题】:How to count the number of files each pattern of a group appears in a file?如何计算一个组的每个模式出现在一个文件中的文件数?
【发布时间】:2021-12-22 11:09:20
【问题描述】:

我在尝试计算特定模式在文件中出现的次数时遇到问题(我们称之为 B)。在这种情况下,我有一个包含 30 个模式的文件(我们称之为 A),我想知道有多少行包含该模式。

只有一种模式很简单:

grep "pattern" file | wc -l

但是对于一个充满它们的文件,我无法弄清楚它是如何工作的。我已经试过了:

grep -f "fileA" "fileB" | wc -l 

尽管如此,它给了我所有模式出现的总次数,而不是每个模式(这就是我想要得到的)。

非常感谢。

【问题讨论】:

  • 在讨论匹配文本时切勿使用 pattern 这个词,因为它非常模棱两可,很可能会给您错误的答案,无论正则表达式或字符串、全或-的组合,始终处于最低状态您需要的部分、单词或行匹配。请参阅stackoverflow.com/questions/65621325/… 了解详细信息,然后edit 你的问题将pattern 替换为您要匹配的适当的正则表达式/字符串+ 完整/部分+ 字/行定义,以便我们为您提供帮助。

标签: bash awk grep


【解决方案1】:

每个文字字符串的匹配计数

如果您只是想知道每个模式出现的频率并且每个模式都是固定字符串(不是正则表达式),请使用 ...

grep -oFf needles.txt haystack.txt | sort | uniq -c

计算每个文字字符串的匹配行数

请注意,上面与您的表述略有不同“我想知道有多少 包含该模式”,因为一行可以有多个匹配项。如果你真的必须计算每个模式的匹配行而不是每个模式的匹配,那么事情会变得有点棘手:

grep -noFf needles.txt haystack.txt | sort | uniq | cut -d: -f2- | uniq -c

计算每个正则表达式的匹配行数

如果模式是正则表达式,您可能需要遍历这些模式,因为grep 的输出只告诉您(至少)一个模式匹配,而不是 哪个 一个。

# this will be very slow if you have many patterns
while IFS= read -r pattern; do
    printf '%8d %s\n' "$(grep -ce "$pattern" haystack.txt)" "$pattern"
done < needles.txt

...或使用其他工具/语言,例如 awkperl


关于重叠匹配的注意事项

您没有制定任何精确的要求,因此我针对每种情况采用了最简单的解决方案。如果多个模式匹配(部分)相同的子字符串,前两个解决方案和最后一个解决方案的行为会有所不同。

  • grep -f needles.txt 最多匹配每个子字符串一次。因此,某些匹配可能会“错过”(“错过”的解释取决于您的要求)
  • 而迭代 grep -e pattern1; grep -e pattern2; ... 可能会多次匹配同一个子字符串。

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多