bash - 如何找到第一个文件中的哪一行在第二个文件中出现频率最高?

标签 bash frequency

我有两个列表。我需要确定第一个列表中的哪个词在第二个列表中出现的频率最高。第一个,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/

相关文章:

bash - 使用 awk、grep、sed 解析大型日志文件 (~5gb) 的性能问题

linux - 完成意外标记附近的语法错误

python - 单词和组元组之间的映射以获得单词的频率

python - 如何使用过零获得声音频率

python - 跟踪 bash 调用

python - 从 python 在后台运行 "linux" sleep

algorithm - 连续序列数据中的模式

timer - 如何设置16位P&F校正PWM中Timer1的频率和占空比

linux - 用于查找 && mkdir 的 Bash 脚本

c - 打印字符串的字母频率