Bash统计File B各变量在File A中出现次数的方法
Bash 实现逐关键词统计文件出现次数方案
你之前执行的grep -wc File_B File_A不符合预期的原因是:grep默认语法为grep [选项] 匹配模式 目标文件,该写法会把字符串File_B当作要匹配的关键词,去检索File_A的内容,自然无法实现逐行读取FileB关键词检索的效果。
方案1:原生grep一行命令实现(最快捷)
grep原生支持从文件读取待匹配关键词,用-f参数指定关键词文件即可,搭配对应参数就能直接统计:
# 普通场景,变量名无正则特殊字符时用 grep -owf FileB FileA | sort | uniq -c
参数说明:
-o:每匹配到一个关键词就单独输出一行,避免一行内多次匹配只计1次的问题-w:整词匹配,避免短变量名误匹配到长变量名的子串(比如变量a不会匹配到ab、ca这类内容)-f FileB:从FileB中逐行读取内容作为匹配关键词
针对你给出的示例文件,执行后输出如下,和Excel count if的计算结果一致:
2 a 2 b
如果你的代码变量名包含
$、*、.这类正则特殊字符,加-F参数让grep按固定字面量匹配即可,避免正则解析导致匹配错误,命令调整为:grep -Fowf FileB FileA | sort | uniq -c
方案2:逐行循环统计(方便扩展自定义逻辑)
如果后续需要加额外判断规则(比如筛选出现次数低于阈值的未使用变量),可以用bash循环逐行读取FileB的关键词逐个统计,逻辑更灵活:
while read -r target_var; do # 跳过FileB里的空行 [ -z "$target_var" ] && continue # 统计当前变量在FileA中的整词出现次数 cnt=$(grep -ow "$target_var" FileA | wc -l) echo "$cnt $target_var" done < FileB
这个脚本的输出结果和方案1完全一致,你可以直接在循环体内加自定义的过滤、输出逻辑。
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

