我有两个清单。我需要确定第一个列表中哪个单词最常出现在第二个列表中。第一个,list1.txt
包含一个单词列表,按字母顺序排序,没有重复。我使用了一些脚本来确保每个单词出现在一个唯一的行上,例如:
canyon
fish
forest
mountain
river
第二个文件list2.txt
是UTF-8,还包含许多项目。我还使用了一些脚本来确保每个单词出现在一个唯一的行上,但有些项目不是单词,有些可能会出现很多次,例如:
fish
canyon
ocean
ocean
ocean
ocean
1423
fish
109
fish
109
109
ocean
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
按第二列降序排序。输出是出现在第一行的单词。
我不认为这是一个很好的脚本,因为它不是那么有效,并且可能没有最频繁的匹配项,例如:
list1.txt
中没有list2.txt
中的任何字词,则输出只是文件list1.txt
中的第一个字,例如{{1}}。 “峡谷”。如何创建一个更高效的脚本,找到第一个列表中哪个词最常出现在第二个列表中?
答案 0 :(得分:7)
您可以使用以下管道:
grep -Ff list1.txt list2.txt | sort | uniq -c | sort -n | tail -n1
F
告诉grep搜索文字,f
告诉它使用list1.txt
作为要搜索的字词列表。其余的对匹配进行排序,计算重复次数,并根据出现的次数对它们进行排序。最后一部分选择最后一行,即最常见的一行(加上出现次数)。
答案 1 :(得分: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
答案 2 :(得分:1)
假设'list1.txt'已排序,我会使用unix join :
sort list2.txt | join -1 1 -2 1 list1.txt - | sort |\
uniq -c | sort -n | tail -n1