Estoy buscando un comando para contar el número de todas las palabras en un archivo. Por ejemplo, si un archivo es así,
today is a
good day
entonces debería imprimir 5
, ya que hay 5
palabras allí.
Estoy buscando un comando para contar el número de todas las palabras en un archivo. Por ejemplo, si un archivo es así,
today is a
good day
entonces debería imprimir 5
, ya que hay 5
palabras allí.
Respuestas:
El comando wc
alias. el recuento de palabras puede hacerlo:
$ 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
wc -w
no tienen la misma definición que para GNU grep -w
. Para wc
una palabra es una secuencia de uno o más caracteres no espaciales ( [:space:]
clase de caracteres en el entorno local actual). Por ejemplo foo,bar
y foo bar
(con un espacio sin interrupciones) son cada una de las palabras.
Se me ocurrió esto por SOLO el número:
wc -w [file] | cut -d' ' -f1
5
También me gusta el wc -w < [file]
enfoque
Finalmente, para almacenar solo el recuento de palabras en una variable, puede usar lo siguiente:
myVar=($(wc -w /path/to/file))
Esto le permite omitir el nombre de archivo con elegancia.
wc -w < "$file"
por SOLO el número.
La mejor solución es usar Perl:
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
@Bernhard
Puede verificar el código fuente del wc
comando desde coreutils, lo pruebo en mi máquina, con el archivo subst.c
en la fuente bash 4.2.
time wc -w subst.c
real 0m0.025s
user 0m0.016s
sys 0m0.000s
Y
time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c
real 0m0.021s
user 0m0.016s
sys 0m0.004s
Cuanto más grande es el archivo, más eficiente es Perl con respecto a wc
.
wc
tardé ~ 14 segundos mientras que Perl tardó ~ 5 segundos!
split
on /\s+/
es como un split(' ')
excepto que cualquier espacio en blanco inicial produce un primer campo nulo. Esa diferencia le dará una palabra adicional (el primer campo nulo, es decir) por enlace de línea . Por (split(" ", $_))
lo tanto, use lo contrario para un archivo creado de esta manera: echo -e "unix\n linux" > testfile
su one-liner informa 3 palabras.
wc
será significativamente más rápido, al igual que con PERLIO=:utf8
, perl
será significativamente más lento.
$ 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
Esto enumera la frecuencia de cada palabra que aparece en el archivo proporcionado. Sé que no es lo que pediste, ¡pero es mejor! Si desea ver las ocurrencias de su palabra, simplemente puede hacer esto:
$ cat your_file.txt | wordfrequency | grep yourword
Incluso agregué esta función a mis archivos .dot
Fuente: AWK-ward Ruby
El wc
programa cuenta las "palabras", pero esas no son, por ejemplo, las "palabras" que mucha gente vería cuando examinen un archivo. El vi
programa, por ejemplo, usa una medida diferente de "palabras", delimitándolas en función de sus clases de caracteres, mientras que wc
simplemente cuenta las cosas separadas por espacios en blanco . Las dos medidas pueden ser radicalmente diferentes. Considere este ejemplo:
first,second
vi
ve tres palabras ( primera y segunda , así como la coma que las separa), mientras wc
ve una (no hay espacios en blanco en esa línea). Hay muchas formas de contar palabras, algunas son menos útiles que otras.
Si bien Perl sería más adecuado para escribir un contador para las palabras de estilo vi, aquí hay un ejemplo rápido usando sed
, tr
y wc
(moderadamente portátil usando retornos de carro literales ^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
Comparación de recuentos:
wc
da 28.Como referencia, POSIX vi dice:
En el entorno local POSIX, vi reconocerá cinco tipos de palabras:
Una secuencia máxima de letras, dígitos y guiones bajos, delimitada en ambos extremos por:
Caracteres que no sean letras, dígitos o guiones bajos
El principio o el final de una línea.
El principio o el final del búfer de edición.
Una secuencia máxima de caracteres que no sean letras, dígitos, guiones bajos o caracteres, delimitados en ambos extremos por:
- Una letra, dígito, guión bajo
<blank>
caracteres- El principio o el final de una línea.
- El principio o el final del búfer de edición.
Una o más líneas en blanco secuenciales
El primer carácter en el búfer de edición
El último que no está
<newline>
en el búfer de edición
wc -w $FILE
?