加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何查找第一个文件中哪一行最常出现在第二个文件中?

发布时间:2020-12-15 22:13:31 所属栏目:安全 来源:网络整理
导读:我有两个清单.我需要确定第一个列表中哪个单词最常出现在第二个列表中.第一个,list1.txt包含一个单词列表,按字母顺序排序,没有重复.我使用了一些脚本来确保每个单词出现在一个唯一的行上,例如: canyonfishforestmountainriver 第二个文件list2.txt是UTF-8,
我有两个清单.我需要确定第一个列表中哪个单词最常出现在第二个列表中.第一个,list1.txt包含一个单词列表,按字母顺序排序,没有重复.我使用了一些脚本来确保每个单词出现在一个唯一的行上,例如:

canyon
fish
forest
mountain
river

第二个文件list2.txt是UTF-8,还包含许多项目.我还使用了一些脚本来确保每个单词出现在一个唯一的行上,但有些项目不是单词,有些可能会出现很多次,例如:

fish
canyon
ocean
ocean
ocean
ocean
1423
fish
109
fish
109
109
ocean

>脚本应输出最常匹配的项目.例如,如果使用上面的2个文件运行,则输出将为“fish”,因为list1.txt中的单词通常出现在list2.txt中.

这是我到目前为止所拥有的.首先,它搜索每个单词并创建一个包含匹配项的CSV文件:

#!/bin/bash
while read -r line
do
    count=$(grep -c ^$line list2.txt)
    echo $line”,”$count >> found.csv
done < ./list1.txt

之后,found.csv按第二列降序排序.输出是出现在第一行的单词.
我不认为,这是一个很好的剧本,因为它不是那么有效,并且可能没有最频繁的匹配项目,例如:

>如果2个或更多单词之间存在平局,例如“鱼”,“峡谷”和“森林”各出现5次,而没有其他出现的频率,输出将是按字母顺序排列的这3个单词,用逗号分隔,例如:“峡谷,鱼,森林”.
>如果list1.txt中的单词都没有出现在list2.txt中,则输出只是文件list1.txt中的第一个单词,例如,“峡谷”.

如何创建一个更有效的脚本,该脚本可以查找第一个列表中哪个词最常出现在第二个列表中?

解决方法

您可以使用以下管道:

grep -Ff list1.txt list2.txt | sort | uniq -c | sort -n | tail -n1

F告诉grep搜索文字单词,f告诉它使用list1.txt作为要搜索的单词列表.其余的对匹配进行排序,计算重复次数,并根据出现的次数对它们进行排序.最后一部分选择最后一行,即最常见的一行(加上出现次数).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读