我有两个列表。我需要确定第一个列表中的哪个词在第二个列表中出现的频率最高。第一个,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
按第二列降序排列。输出是出现在第一行的单词。
不过,我不认为这是一个好的脚本,因为它效率不高,并且可能没有最频繁的匹配项,例如:
- 如果两个或多个单词之间有联系,例如“fish”、“canyon”和“forest”各出现 5 次,而其他出现次数不多,输出将是这 3 个词按字母顺序排列,用逗号分隔,例如:“canyon,fish,forest”。
- 如果
list1.txt
中没有任何单词出现在list2.txt
, 那么输出就是文件list1.txt
中的第一个单词,例如“峡谷”。
我怎样才能创建一个更高效的脚本来找出第一个列表中的哪个词在第二个列表中最常出现?
最佳答案
您可以使用以下管道:
grep -Ff list1.txt list2.txt | sort | uniq -c | sort -n | tail -n1
F
告诉 grep 搜索文字单词,f
告诉它使用 list1.txt
作为要搜索的单词列表。其余的对匹配项进行排序,计算重复项,并根据出现次数对它们进行排序。最后一部分选择最后一行,即最常见的一行(加上出现的次数)。
关于bash - 如何找到第一个文件中的哪一行在第二个文件中出现频率最高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12384629/