如何统计文件中的总字数?

如何统计文件中的总字数?

我正在寻找一个命令来计算文件中所有单词的数量。例如,如果一个文件是这样的,

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, trand 的简单示例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 应识别五种单词:

  1. 字母、数字和下划线的最大序列,两端用以下分隔符:

    • 字母、数字或下划线以外的字符

    • 一行的开头或结尾

    • 编辑缓冲区的开头或结尾

  2. 除字母、数字、下划线或字符之外的最大字符序列,两端用以下分隔符:

    • 字母、数字、下划线
    • <blank>人物
    • 一行的开头或结尾
    • 编辑缓冲区的开头或结尾
  3. 一个或多个连续的空行

  4. 编辑缓冲区中的第一个字符

  5. 最后一个非<newline>在编辑缓冲区中

相关内容