2016-11-20 13 views
2

すべての行に単語を含むtxtファイルがあります。テキストファイル内で最も頻繁に出現する単語はどれですか?

"word1" 
"word1" 
"word2" 
"word2" 
"word1" 

私はどの言葉が一番出てくるのか知りたいですが、どのように考えたらいいのでしょうか? meh.txtがあなたのファイルである

+0

これは簡単なPerlスクリプトで作成します。このために厳密にbashを使用する必要がありますか? –

+1

"WORD1"は "word1"と同じであると考えられますか? –

答えて

4

注意を取得する:大文字小文字を区別しないソリューションの一番下を参照してください。

sortuniqhead、およびcut呼び出しの組み合わせは、概念的に最も単純な、とも拡張可能であるが、ここではより複雑なものの、おそらく、より効率的であるシングルパスawkソリューション、および限られたです唯一の「勝者」を見つけるためのとネクタイのイベントで予測不可能な順序で:

awk '{ if (++words[$0] > max) { max = words[$0]; maxW=$0 } } END { print maxW }' file 

サンプル入力では、"word2"(二重引用符を含む)が返されます。
print max, maxWを使用してもカウントを出力します。

タイの場合、最大値を共有する単語のうち、入力ファイルに最後に出現したものがである(出力されます)。ここで


は、トップNワード
にソリューションを拡張を可能マルチユーティリティ相当、だとも引き分けのイベントで受賞者の間で予測可能な順序を提供しています:

$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 1 | cut -d\" -f2 
word2 

タイの場合は、アルファベット順に最初にという単語を共有します。カウントが印刷されます。

注:便宜上、上の例では、二重引用符を囲まずに単語を抽出するためにcutを使用しています。

awkの代わりcut使用し、二重引用符を保持するには:

$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 1 | awk '{print $NF}' 
"word2" 

最後のパイプライン・セグメントを省略し、head-n 1オプションを変更するには、各単語の多くの出現が発見されたかを確認してにすることができます上のN個の単語(二重引用符を含む)を見つける;例えば、(サンプル入力して、あなただけの2を取得)トップ10を見るために:

$ sort file | uniq -c | sort -k1,1nr -k2b | head -n 10 
    3 "word1" 
    2 "word2" 

sortコールノート、sort -k1,1nr -k2b

明示的にソートフィールドを述べるがあります良い練習 - の両方の効率化のため、予期せぬ結果を避けるために:によって主に

  • -k1,1nr種類を最初空白で区切られたフィールド(k1,1)、数値的に(-n)、逆の順番()。

    • -k1,1で明示的に終了インデックス、ちょうど-k1はラインの最後までフィールド1 から始まるものを並べ替えると同じように。そして語彙を行う。
  • -k2bは次に二次先頭の空白(フィールドを分離する空白b)を無視して、ライン-k2)の端部を通って空白で区切られたフィールド始まるソートさ(アルファベット順)ソート。

新しいバージョンのGNUsort(ないMacOSの上の一つは、残念ながら)それぞれの行がソートの際にキーに分割する方法を可視化する有用--debugオプションがあります。全体行をソートするだけsortまたはsort -nrを使用して


は魅力的ですが、必ずしも期待される結果が得られていません:

  • ジャストsortは(アルファベット順)字句行全体をソートし、昇順で第1フィールドの単語数の埋め込まれた固定幅の性質のため、結果は依然として効果的に数値的にソートされますが、ネクタイの場合は、アルファベット順に最後の語が出力されます。

  • ちょうどsort -rnは、降順で行全体に数値ソートを適用します。数値ソートフィールドの解析は、数値として解釈できる最長のプレフィックスで停止するため、ラストリゾート比較と呼ばれる暗黙的な機能(-nでオフにすることができます)は、のアルファベット順で残りの行をソートします場合)。従って、同義語の場合にはアルファベット順に出力される最後のワードである。


大文字と小文字を区別しない変種

注入力が簡単にするためにすべて小文字に変換されていること。

  • awk
awk '{ $0=tolower($0); if (++wds[$0] > max) { max = wds[$0]; maxW=$0 } } END { print maxW }' file 
  • sort + uniq + head + cut
tr '[:upper:]' '[:lower:]' < file | 
    sort | uniq -c | sort -k1,1nr -k2b | head -n 1 | cut -d\" -f2 
1
sort meh.txt | uniq -c 

。これは各単語の数を示します。テキストでこれを実行する

ができます:

3 "word1" 
2 "word2" 

をあなたが唯一の最も一般的に必要がある場合は、あなたがそれを得ることができます(多分これを行うには短い方法がある

sort meh.txt | uniq -c | sort -n | tail -1 

、しかし、私はそれを知らない)

1

はこのような何かを試してみてください。cat test | sort | uniq -c

  • 猫が出現箇所の使用なしであなただけのトップの単語をしたい場合は
  • ソートが
+1

'catはここでは不要なファイル'を読み込みます。 'sort'もファイルを読むことができます。 – Sundeep

0

「出現数によってプレフィックスライン」uniqのコマンドの-cと

  • uniqのそれをソートしたファイルを読み込みませんこのようなもの。

    sort test.txt|uniq -c|sort -nr|head -1

    あなたは上位n単語を見つけるために、上記を変更することができます。例えば、トップ3の単語

    sort test.txt|uniq -c|sort -nr|head -3

  • 関連する問題