2012-09-12 63 views
4

我有兩個列表。我需要確定第一個列表中哪個單詞出現在第二個列表中的頻率最高。第一個,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個文件運行,則輸出將是「魚」,因爲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是降序排序第二列。輸出是出現在第一行的單詞。 我不認爲,雖然,這是一個好劇本,因爲它不是那麼有效,而且有可能有可能不是一個最常見的匹配項,對於如:

  • 如果出現平局在兩個或更多個單詞之間,例如「魚」,「峽谷」和「森林」每個出現5次,而沒有其他出現的頻率很高,輸出將按照字母順序排列,用逗號隔開,例如:「峽谷,魚,森林」。
  • 如果在list2.txt中沒有出現list1.txt的單詞,則輸出僅爲文件list1.txt的第一個單詞,例如, 「峽谷」。

如何創建一個更高效的腳本來查找第一個列表中哪個單詞出現在第二個單詞中?

回答

7

您可以使用下面的管道:

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

F告訴grep來搜索文本的話,f告訴它使用list1.txt作爲詞搜索列表。其餘的分類匹配,重複計數,並根據出現次數對它們進行排序。最後一部分選擇最後一行,即最常見的一行(加上出現次數)。

1

假設 'list1.txt' 進行排序,我會用UNIX 加入

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

+1加入的漂亮的應用程序。你不需要指定連接字段,但它們默認爲1;而第二類是不需要的。但是,您需要對「list1.txt」進行排序。像這樣:join <(sort list1.txt)<(sort list2.txt)| uniq -c | sort -nr |頭-n1'。 – Thor

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 
相關問題