【问题标题】:How to find which line from first file appears most frequently in second file?如何查找第一个文件中的哪一行最常出现在第二个文件中?
【发布时间】:2012-09-12 17:31:15
【问题描述】:

我有两个列表。我需要确定第一个列表中的哪个单词最常出现在第二个列表中。第一个,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 个或多个单词之间有联系,例如“fish”、“canyon”和“forest”各出现 5 次,而没有其他出现频率如此之高,输出将是这 3 个按字母顺序排列的单词,用逗号分隔,例如:“canyon,fish,forest”。
  • 如果list1.txt 中没有任何单词出现在list2.txt 中,则输出只是文件list1.txt 中的第一个单词,例如“峡谷”。

如何创建一个更高效的脚本来查找第一个列表中的哪个单词最常出现在第二个列表中?

【问题讨论】:

    标签: bash frequency


    【解决方案1】:

    您可以使用以下管道:

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

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

    【讨论】:

      【解决方案2】:
      > awk 'FNR==NR{a[$1]=0;next}($1 in a){a[$1]++}END{for(i in a)print a[i],i}' file1 file2 | sort -rn|head -1
      

      【讨论】:

        【解决方案3】:

        假设 'list1.txt' 已排序,我会使用 unix join :

        sort list2.txt | join -1 1 -2 1 list1.txt - | sort |\
           uniq -c | sort -n | tail -n1
        

        【讨论】:

        • +1 很好的连接应用。您不需要指定连接字段,默认情况下它们是 1;并且不需要第二种。但是,您确实需要对list1.txt 进行排序。像这样的东西:join &lt;(sort list1.txt) &lt;(sort list2.txt) | uniq -c | sort -nr | head -n1.
        猜你喜欢
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多