ファイル内のすべての単語数を計算するコマンドを探しています。たとえば、ファイルが次のような場合、
today is a
good day
5
その後、そこに単語があるので印刷する必要があります5
。
答え1
このコマンドwc
はとも呼ばれます。単語数は次のとおりです。
$ 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
答え2
私は数字のせいでこれを思い出しました。
wc -w [file] | cut -d' ' -f1
5
私もこのwc -w < [file]
方法が好き
最後に、変数に単語数だけを保存するには、次を使用できます。
myVar=($(wc -w /path/to/file))
これにより、ファイル名を正常にスキップできます。
答え3
より良い解決策はPerlを使用することです。
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
@bernhard
coreutilsでコマンドのソースコードを確認できますwc
。私のコンピュータでテストしましたが、ファイルはsubst.c
bash 4.2のソースコードにあります。
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
。
答え4
プログラムwc
は「単語」を計算しますが、これは多くの人がファイルを調べるときに見る「単語」ではありません。たとえば、vi
プログラムは、「単語」のさまざまな測定値を使用して、文字のカテゴリに応じて区切り、wc
単に数字を数えることです。スペースで区切る。両方の測定値はかなり異なる場合があります。次の例を考えてみましょう。
first,second
vi
よりサム性格(最初そして第二そしてそれを区切るカンマ)もwc
参照してください。一つ(この行にはスペースはありません)。単語数を数える方法はいくつかありますが、一部は他のものよりもあまり役に立ちません。
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
数の比較:
- スクリプト自体を実行すると、76の単語が出ました。
- @cuonglmのPerlの例は31を提供します。
- 使用すると
wc
28になります。
参考までに、POSIX vi説明する:
POSIXロケールでは、viは5種類の単語を認識する必要があります。
次の区切り文字で区切られた文字、数字、アンダースコアの最大順序:
文字、数字、下線以外の文字
行の始まりまたは終わり
バッファの開始または終了の編集
文字、数字、下線、または文字を除く最大の文字シーケンスで、次の区切り文字で区切られます。
- 文字、数字、下線
<blank>
数値- 行の始まりまたは終わり
- バッファの開始または終了の編集
1つ以上の連続した空行
バッファの最初の文字の編集
最後の雨
<newline>
編集バッファから