すべての行に単語を含むtxtファイルがあります。テキストファイル内で最も頻繁に出現する単語はどれですか?
"word1"
"word1"
"word2"
"word2"
"word1"
私はどの言葉が一番出てくるのか知りたいですが、どのように考えたらいいのでしょうか? meh.txtがあなたのファイルである
すべての行に単語を含むtxtファイルがあります。テキストファイル内で最も頻繁に出現する単語はどれですか?
"word1"
"word1"
"word2"
"word2"
"word1"
私はどの言葉が一番出てくるのか知りたいですが、どのように考えたらいいのでしょうか? meh.txtがあなたのファイルである
注意を取得する:大文字小文字を区別しないソリューションの一番下を参照してください。
sort
、uniq
、head
、およびcut
呼び出しの組み合わせは、概念的に最も単純な、とも拡張可能であるが、ここではより複雑なものの、おそらく、より効率的であるシングルパスawk
ソリューション、および限られたです唯一の「勝者」を見つけるためのとネクタイのイベントで予測不可能な順序で:
awk '{ if (++words[$0] > max) { max = words[$0]; maxW=$0 } } END { print maxW }' file
サンプル入力では、"word2"
(二重引用符を含む)が返されます。
print max, maxW
を使用してもカウントを出力します。
タイの場合、最大値を共有する単語のうち、入力ファイルに最後に出現したものがである(出力されます)。ここで
$ 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
sort meh.txt | uniq -c
。これは各単語の数を示します。テキストでこれを実行する
ができます:
3 "word1"
2 "word2"
をあなたが唯一の最も一般的に必要がある場合は、あなたがそれを得ることができます(多分これを行うには短い方法がある
sort meh.txt | uniq -c | sort -n | tail -1
、しかし、私はそれを知らない)
はこのような何かを試してみてください。cat test | sort | uniq -c
'catはここでは不要なファイル'を読み込みます。 'sort'もファイルを読むことができます。 – Sundeep
「出現数によってプレフィックスライン」uniqのコマンドの-cと
sort test.txt|uniq -c|sort -nr|head -1
あなたは上位n単語を見つけるために、上記を変更することができます。例えば、トップ3の単語
sort test.txt|uniq -c|sort -nr|head -3
これは簡単なPerlスクリプトで作成します。このために厳密にbashを使用する必要がありますか? –
"WORD1"は "word1"と同じであると考えられますか? –