小説、ノンフィクション、新聞記事などを含むテキストファイルがたくさんあるとしましょう。 (特定言語のテキストのランダムな例)
最も一般的な単語が最初に含まれている特定の単語の頻度リストが必要です。
このためにCコードを書くことができますが、より速い方法がある場合は知りたいです。 (より高速なのは、実行時間ではなくエンコード時間を意味します。)
答え1
より速いコーディング時間のために今成功してみた方法は次のとおりです。
printf '%s\n' $(cat *.txt) | sort | uniq -c | sort -gr | less
答え2
Cで書くとランタイムが速くなりますが、書くのに時間がかかります。良いトレードオフは、awkを使用することです。
count.awk
FNR == NR { pat[$1] = 1; next }
{
for(p in pat)
if(index($0, p))
pat[p]++
}
END {
for(p in pat)
print pat[p]-1, p
}
まず、単語リスト(1行に1単語)を読み、次に残りの入力から一致するものを計算します。次のように実行します。
cat *.txt | awk -f tally.awk wordlist - | sort -nr
上記のコードは部分文字列とも一致します。単語全体を一致させるには、そのindex
行を次のように置き換えます。
if(match($0, "\\<" p "\\>"))
答え3
次のようにできます(GNU grepを使用)。
grep -hEo "[[:alnum:]_'-]+" ./*.txt | sort | uniq -c | sort -rn
上記の内容を[:alnum:]_'-
単語コンポーネントに変更します。