4

私は2つのリストを持っています。最初のリストのどの単語が2番目のリストに最も頻繁に表示されるかを判別する必要があります。1つ目list1.txtは、重複のないアルファベット順にソートされた単語のリストを含みます。各単語が一意の行に表示されるようにするスクリプトをいくつか使用しました。例:

canyon
fish
forest
mountain
river

2番目のファイル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、2列目から降順に並べ替えられます。出力は、最初の行に表示される単語です。ただし、これはあまり効率的ではなく、最も頻繁に一致するアイテムがない可能性があるため、これが優れたスクリプトであるとは思いません。たとえば、次のようになります。

  • 「魚」、「峡谷」、「森」など、2つ以上の単語が同点の場合、「魚」、「峡谷」、「森」はそれぞれ5回出現しますが、他の単語はそれほど頻繁には出現しません。出力は、これら3つの単語をアルファベット順にカンマで区切って表示します。例:「峡谷、魚、森」。
  • の単語がいずれもにlist1.txt表示されない場合list2.txt、出力はファイルの最初の単語になりますlist1.txt(例:「canyon」)。

最初のリストのどの単語が2番目のリストに最も頻繁に表示されるかを見つける、より効率的なスクリプトを作成するにはどうすればよいですか?

4

3 に答える 3

7

次のパイプラインを使用できます。

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

Fgrep に文字通りの単語を検索するように指示し、検索する単語のリストとしてf使用するように指示します。list1.txt残りは一致を並べ替え、重複を数え、出現回数に従って並べ替えます。最後の部分は、最後の行、つまり最も一般的な行 (および出現回数) を選択します。

于 2012-09-12T09:06:03.930 に答える
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
于 2012-09-12T09:19:32.810 に答える
1

「list1.txt」がソートされていると仮定すると、unix joinを使用します。

sort list2.txt | join -1 1 -2 1 list1.txt - | sort |\
   uniq -c | sort -n | tail -n1
于 2012-09-12T09:16:49.390 に答える