como contar o número total de palavras em um arquivo?

17

Estou procurando um comando para contar o número de todas as palavras em um arquivo. Por exemplo, se um arquivo é assim,

today is a 
good day

então deve imprimir 5 , pois há 5 palavras.

    
por Richard 19.06.2013 / 19:04

5 respostas

38

O comando wc aka. contagem de palavras pode fazer isso:

$ wc -w <file>

exemplo

$ 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
    
por 19.06.2013 / 19:07
7

Eu inventei isso para o número JUST:

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

5

Eu também gosto da abordagem wc -w < [file]

Por fim, para armazenar apenas a contagem de palavras em uma variável, você pode usar o seguinte:

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

Isso permite que você pule o nome do arquivo com elegância.

    
por 19.06.2013 / 19:29
3

A melhor solução é usar o Perl:

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

@Bernhard

Você pode verificar o código fonte do comando wc do coreutils, eu testei na minha máquina, com o arquivo subst.c no bash 4.2 source.

time wc -w subst.c

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

e

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

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

Quanto maior o arquivo, mais eficiente o Perl é em relação a wc .

    
por 19.06.2013 / 19:11
3

Vamos usar o 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

Isto lista a frequência de cada palavra que ocorre no arquivo fornecido. Eu sei que não é o que você pediu, mas é melhor! Se você quiser ver as ocorrências da sua palavra, basta fazer isso:

$ cat your_file.txt | wordfrequency | grep yourword

Até adicionei essa função ao meu .dotfiles

Fonte: Ruby do AWK-ward

    
por 15.12.2014 / 23:43
3

O programa wc conta "palavras", mas essas não são, por exemplo, as "palavras" que muitas pessoas veriam ao examinar um arquivo. O programa vi , por exemplo, usa uma medida diferente de "palavras", delimitando-as com base em suas classes de caracteres, enquanto wc simplesmente conta as coisas separados por espaço em branco . As duas medidas podem ser radicalmente diferentes. Considere este exemplo:

first,second

vi três palavras ( primeiro e segundo , bem como a vírgula separando-as), enquanto wc um (não há espaço em branco nessa linha). Existem muitas maneiras de contar palavras, algumas são menos úteis que outras.

Enquanto o Perl seria mais adequado para escrever um contador para as palavras no estilo vi, aqui está um exemplo rápido usando sed , tr e wc (moderadamente portátil usando retornos de carro literais ^M ):

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

Comparando contagens:

  • A execução do script em si, me dá 76 palavras.
  • O exemplo em Perl por @cuonglm dá 31.
  • Usando wc dá 28.

Para referência, POSIX vi diz:

In the POSIX locale, vi shall recognize five kinds of words:

  1. A maximal sequence of letters, digits, and underscores, delimited at both ends by:

    • Characters other than letters, digits, or underscores

    • The beginning or end of a line

    • The beginning or end of the edit buffer

  2. A maximal sequence of characters other than letters, digits, underscores, or characters, delimited at both ends by:

    • A letter, digit, underscore
    • <blank> characters
    • The beginning or end of a line
    • The beginning or end of the edit buffer
  3. One or more sequential blank lines

  4. The first character in the edit buffer

  5. The last non-<newline> in the edit buffer

    
por 20.09.2016 / 13:40