
¿Cómo puedo encontrar el recuento de cada palabra en un archivo?
Quiero un histograma de cada palabra en un canal de texto o documento. Existirán líneas nuevas y líneas vacías en el documento. Lo desnudé todo excepto [a-zA-Z]
.
> cat doc.txt
word second third
word really
> cat doc.txt | ... # then count occurrences of each word \
# and print in descending order separated by delimiter
word 2
really 1
second 1
third 1
Debe ser algo eficiente ya que el archivo es de texto de 1 GB y no puede funcionar con una carga de tiempo exponencial.
Respuesta1
Prueba esto:
grep -o '\w*' doc.txt | sort | uniq -c | sort -nr
-o
Imprima cada coincidencia en lugar de líneas coincidentes\w*
Emparejar caracteres de palabrassort
clasifique las coincidencias antes de enviarlas auniq
.uniq -c
imprimir las líneas únicas y el número de apariciones-c
sort -nr
Ordenación inversa por número de ocurrencias.
Producción:
2 word
1 third
1 second
1 really
Alternativa:
Utilice awk
para la salida exacta:
$ grep -o '\w*' doc.txt \
| awk '{seen[$0]++} END{for(s in seen){print s,seen[s]}}' \
| sort -k2r
word 2
really 1
second 1
third 1
Respuesta2
perl -lnE '
$count{$_}++ for /[[:alpha:]]+/g;
END {
say "@$_" for
sort {$b->[1] <=> $a->[1] || $a->[0] cmp $b->[0]}
map {[$_, $count{$_}]}
keys %count
}
' doc.txt
Esto consumirá mucha más memoria que la solución inicial de pLumo.