Obtenga el recuento de apariciones de cada palabra en el documento.

Obtenga el recuento de apariciones de cada palabra en el documento.

¿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
  • -oImprima cada coincidencia en lugar de líneas coincidentes
  • \w*Emparejar caracteres de palabras
  • sortclasifique las coincidencias antes de enviarlas a uniq.
  • uniq -cimprimir las líneas únicas y el número de apariciones-c
  • sort -nrOrdenación inversa por número de ocurrencias.

Producción:

  2 word
  1 third
  1 second
  1 really

Alternativa:

Utilice awkpara 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.

información relacionada