我正在寻找一个命令来计算文件中所有单词的数量。例如,如果一个文件是这样的,
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
@伯恩哈德
您可以从 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
and 的简单示例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 应识别五种单词:
字母、数字和下划线的最大序列,两端用以下分隔符:
字母、数字或下划线以外的字符
一行的开头或结尾
编辑缓冲区的开头或结尾
除字母、数字、下划线或字符之外的最大字符序列,两端用以下分隔符:
- 字母、数字、下划线
<blank>
人物- 一行的开头或结尾
- 编辑缓冲区的开头或结尾
一个或多个连续的空行
编辑缓冲区中的第一个字符
最后一个非
<newline>
在编辑缓冲区中