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


Respostas:


39

O comando wcaka. a 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

11
Observe que as palavras para wc -wnão têm a mesma definição que para o GNU grep -w. Para wcuma palavra, é uma sequência de um ou mais caracteres não espaciais ( [:space:]classe de caractere no código do idioma atual). Por exemplo, foo,bare foo bar(com um espaço sem quebra) são cada uma palavra.
Stéphane Chazelas

7

Eu vim com isso apenas para o número:

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

5

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

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.


14
wc -w < "$file"para APENAS o número.
Stéphane Chazelas

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 de wccomando do coreutils, eu testei na minha máquina, com o arquivo subst.cno 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.


13
Por que isso é melhor que o wc?
Sparr

2
@ Parr, por um lado, porque, para minha grande surpresa, parece ser muito mais rápido. Eu tentei em um arquivo de texto com 141813504 palavras e wclevei ~ 14seg enquanto Perl levou ~ 5seg!
terdon

3
Eu acho que a questão 'maior' realmente é uma resposta que depende do Perl e eu nunca sou um grande fã dessa dependência. Se a pergunta fosse sobre desempenho, isso seria outra coisa.
precisa

5
Observe que um spliton /\s+/é como um, split(' ')exceto que qualquer espaço em branco à esquerda produz um primeiro campo nulo. Essa diferença fornecerá uma palavra extra (o primeiro campo nulo, ou seja) por link de linha . Portanto, use o (split(" ", $_))contrário para um arquivo criado assim: echo -e "unix\n linux" > testfilesua linha de base reporta três palavras.
21813 Don_crissti

11
Seus tempos mostram que o wc é mais rápido (são os tempos do usuário e do sistema que são importantes lá). Com LC_ALL = C, wcserá significativamente mais rápido, assim como com PERLIO=:utf8, perlserá significativamente mais lento.
Stéphane Chazelas

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

Isso 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 o seguinte:

$ cat your_file.txt | wordfrequency | grep yourword

Eu até adicionei essa função aos meus arquivos .dotfiles


Fonte: Ruby da ala AWK


Conta palavras, por isso é bom o suficiente para mim! :-)
aggsol

3

O wcprograma conta "palavras", mas essas não são, por exemplo, as "palavras" que muitas pessoas verão quando examinam um arquivo. O viprograma, por exemplo, usa uma medida diferente de "palavras", delimitando-as com base em suas classes de caracteres, enquanto wcsimplesmente conta as coisas separadas por espaços em branco . As duas medidas podem ser radicalmente diferentes. Considere este exemplo:

first,second

vitrês palavras ( primeira e segunda , bem como a vírgula que as separa), enquanto wcuma (não há espaço em branco nessa linha). Existem muitas maneiras de contar palavras, algumas são menos úteis que outras.

Embora o Perl seja mais adequado para escrever um contador para as palavras do estilo vi, aqui está um exemplo rápido de using sed, tre wc(moderadamente portátil usando retornos de carro literais ^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

Comparando contagens:

  • Executar o script por si só me dá 76 palavras.
  • O exemplo em Perl de @cuonglm fornece 31.
  • Usando wcdá 28.

Para referência, o POSIX vi diz:

No código do idioma POSIX, o vi deve reconhecer cinco tipos de palavras:

  1. Uma sequência máxima de letras, dígitos e sublinhados, delimitada nas duas extremidades por:

    • Caracteres que não sejam letras, dígitos ou sublinhados

    • O início ou o fim de uma linha

    • O início ou o fim do buffer de edição

  2. Uma sequência máxima de caracteres que não sejam letras, dígitos, sublinhados ou caracteres, delimitada nas duas extremidades por:

    • Uma letra, dígito, sublinhado
    • <blank> personagens
    • O início ou o fim de uma linha
    • O início ou o fim do buffer de edição
  3. Uma ou mais linhas em branco seqüenciais

  4. O primeiro caractere no buffer de edição

  5. O último que não está <newline>no buffer de edição

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.