ファイル内のすべての単語の数を数えるコマンドを探しています。たとえば、ファイルがこのような場合、
today is a
good day
次に、5
、5
そこに言葉。
コマンド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
私はちょうど数のためにこれを思いつきました:
wc -w [file] | cut -d' ' -f1
5
wc -w < [file]
アプローチも気に入っています
最後に、Wordカウントのみを変数に格納するには、以下を使用できます。
myVar=($(wc -w /path/to/file))
これにより、ファイル名をエレガントにスキップできます。
wc
プログラムは「単語」を数えますが、それらはたとえば、多くの人がファイルを調べるときに目にする「単語」ではありません。たとえばvi
プログラムは、文字クラスに基づいて区切る「単語」の別の尺度を使用しますが、wc
は単純にカウントします 空白で区切られた 。 2つの指標は根本的に異なる場合があります。この例を考えてみましょう:
first,second
vi
は、3ワード(firstおよびsecond およびそれらを区切るコンマ)、wc
はoneを参照(その行に空白はありません) 。単語を数える方法はたくさんありますが、他のものよりも役に立たないものもあります。
Perlはviスタイルの単語のカウンターを作成するのに適していますが、sed
、tr
および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
カウントの比較:
wc
を使用すると、28が得られます。参考までに、 POSIX vi は次のように述べています。
POSIXロケールでは、viは5種類の単語を認識します。
両端が次のように区切られた文字、数字、およびアンダースコアの最大シーケンス。
文字、数字、アンダースコア以外の文字
行の最初または最後
編集バッファーの開始または終了
文字、数字、アンダースコア、文字以外の文字の最大シーケンス。両端が次のように区切られます。
- 文字、数字、アンダースコア
<blank>
文字- 行の最初または最後
- 編集バッファーの開始または終了
1つ以上の連続する空白行
編集バッファーの最初の文字
最後の非
<newline>
編集バッファー内
$ 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
より良い解決策は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
に関してより効率的です。