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
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.
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.
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
.
$ 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
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
vê três palavras ( primeiro e segundo , bem como a vírgula separando-as), enquanto wc
vê 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:
wc
dá 28. Para referência, POSIX vi diz:
In the POSIX locale, vi shall recognize five kinds of words:
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
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
One or more sequential blank lines
The first character in the edit buffer
The last non-
<newline>
in the edit buffer
Tags text-processing wc