如何统计模式文件A中每个模式在目标文件B中对应的匹配行数?
方案1:循环遍历模式文件(易理解,适配大多数场景)
直接逐行读取fileA中的模式,逐个统计在fileB中的匹配行数:
while IFS= read -r pattern; do # 统计当前模式匹配行数,-c参数直接返回匹配行数无需接wc -l count=$(grep -c "$pattern" fileB) echo "$pattern: $count" done < fileA
- 如果你的模式是纯固定字符串、不需要正则解析,给
grep加上-F参数,既可以避免正则特殊字符转义问题,运行速度也更快。 - 若需要仅匹配整行完全一致的内容,再加
-x参数即可。
方案2:单awk命令(大文件场景效率更高)
仅读取fileA和fileB各一次,避免循环中多次重复读取fileB,适合文件体积较大的场景:
# 正则匹配模式版本 awk 'NR==FNR {patterns[$0]=0; next} {for (p in patterns) {if ($0 ~ p) patterns[p]++}} END {for(p in patterns) print p ": " patterns[p]}' fileA fileB
如果是固定字符串匹配,可以用以下性能更高的版本,避免正则解析开销:
# 固定字符串匹配版本 awk 'NR==FNR {patterns[$0]=0; next} {for (p in patterns) {if (index($0, p) != 0) patterns[p]++}} END {for(p in patterns) print p ": " patterns[p]}' fileA fileB
内容的提问来源于stack exchange,提问作者Javier Biotech
相关产品推荐
相关产品推荐

