web-dev-qa-db-ja.com

ファイル内の単語の総数を数える方法は?

ファイル内のすべての単語の数を数えるコマンドを探しています。たとえば、ファイルがこのような場合、

today is a 
good day

次に、55そこに言葉。

18
Richard

コマンドwc aka。文字カウントはそれを行うことができます:

$ wc -w <file>

$ cat sample.txt
today is a 
good day


$ wc -w sample.txt
5 sample.txt


# just the number (thanks to Stephane Chazelas' comment)
$ wc -w < sample.txt
5
40
slm

私はちょうど数のためにこれを思いつきました:

wc -w [file] | cut -d' ' -f1

5

wc -w < [file]アプローチも気に入っています

最後に、Wordカウントのみを変数に格納するには、以下を使用できます。

myVar=($(wc -w /path/to/file))

これにより、ファイル名をエレガントにスキップできます。

7
Michael Durrant

wcプログラムは「単語」を数えますが、それらはたとえば、多くの人がファイルを調べるときに目にする「単語」ではありません。たとえばviプログラムは、文字クラスに基づいて区切る「単語」の別の尺度を使用しますが、wcは単純にカウントします 空白で区切られた 。 2つの指標は根本的に異なる場合があります。この例を考えてみましょう:

first,second

viは、3ワード(firstおよびsecond およびそれらを区切るコンマ)、wconeを参照(その行に空白はありません) 。単語を数える方法はたくさんありますが、他のものよりも役に立たないものもあります。

Perlはviスタイルの単語のカウンターを作成するのに適していますが、sedtrおよびwcを使用した簡単な例を次に示します(リテラルキャリッジリターンを使用して適度に移植可能) ^M):

#!/bin/sh
in_words="[[:alnum:]_]"
in_punct="[][{}\\|:\"';<>,./?\`~!@#$%^&*()+=-]"
sed     -e "s/\($in_words\)\($in_punct\)/\1^M\2/g" \
        -e "s/\($in_punct\)\($in_words\)/\1^M\2/g" \
        -e "s/[[:space:]]/^M/g" \
        "$@" |
tr '\r' '\n' |
sed     -e '/^$/d' |
wc      -l

カウントの比較:

  • スクリプトをそれ自体で実行すると、76語になります。
  • @cuonglmによるPerlの例は31を与えます。
  • wcを使用すると、28が得られます。

参考までに、 POSIX vi は次のように述べています。

POSIXロケールでは、viは5種類の単語を認識します。

  1. 両端が次のように区切られた文字、数字、およびアンダースコアの最大シーケンス。

    • 文字、数字、アンダースコア以外の文字

    • 行の最初または最後

    • 編集バッファーの開始または終了

  2. 文字、数字、アンダースコア、文字以外の文字の最大シーケンス。両端が次のように区切られます。

    • 文字、数字、アンダースコア
    • <blank>文字
    • 行の最初または最後
    • 編集バッファーの開始または終了
  3. 1つ以上の連続する空白行

  4. 編集バッファーの最初の文字

  5. 最後の非<newline>編集バッファー内

3
Thomas Dickey

AWKを使ってみよう!

$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { Word = tolower($i) words[Word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn } 
$ cat your_file.txt | wordfrequency

これは、提供されたファイルで発生する各Wordの頻度をリストします。私はそれがあなたが要求したものではないことを知っていますが、それはより良いです! Wordの出現を確認したい場合は、次のようにします。

$ cat your_file.txt | wordfrequency | grep yourword

この関数を。dotfilesに追加しました


ソース: AWK-ward Ruby

3
Sheharyar

より良い解決策はPerlを使用することです:

Perl -nle '$Word += scalar(split(/\s+/, $_)); END{print $Word}' filename

@ Bernhard

あなたはcoreutilsからwcコマンドのソースコードをチェックすることができます。私は自分のマシンでテストし、bash 4.2ソースのファイルsubst.cを使用します。

time wc -w subst.c

real    0m0.025s
user    0m0.016s
sys     0m0.000s

そして

time Perl -nle '$Word += scalar(split(" ", $_)); END{print $Word}' subst.c

real    0m0.021s
user    0m0.016s
sys     0m0.004s

ファイルが大きいほど、Perlはwcに関してより効率的です。

3
cuonglm