Obtenga el recuento de palabras de archivo de texto de todas las palabras y la salida de impresión ordenada

28

Tenía un comando que funcionaba a través de un archivo de texto, contaba todas las apariciones de las palabras e imprimía así:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

Por lo tanto, no busca línea por línea, sino palabra por palabra, y lo hace para todas las palabras, no solo para 1 palabra. Lo encontré en algún lugar de Internet hace mucho tiempo, pero no puedo encontrarlo ni recordarlo.

Kusalananda
fuente

Respuestas:

33

Yo usaría en trlugar de awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr simplemente reemplaza espacios con líneas nuevas
  • grep -v "^\s*$" recorta líneas vacías
  • sort prepararse como entrada para uniq
  • uniq -c para contar sucesos
  • sort -bnr ordena en orden inverso numérico mientras ignora los espacios en blanco

Guau. resultó ser un gran comando para contar juramentos por líneas

encontrar . -name "* .py" -exec cat {} \; El | tr '[: espacio:]' '[\ n *]' | grep -v "^ \ s * $" | ordenar | uniq -c | ordenar -bnr | mierda grep

seler
fuente
Es posible que desee utilizar tr -spara manejar múltiples espacios, especialmente cuando encuentre sangría.
Arcege
@ Argege: Buen punto. Aunque no cambiará el resultado, puede ajustar un poco el script.
seler
-g( --general-numeric-sort) opción de sortpuede ser preferible en algunos casos. Por ejemplo sort -n, mantendrá10\n1 4 como está, tratando 1 4como 14, mientras que sort -gse tratará correctamente como 1 4\n10.
Skippy le Grand Gourou
buen comando, realmente merece un voto :)
Noor
@seler Creo que puede hacer que la parte grep y tr sea aún más simple como a continuación: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrTenga en cuenta que soy un principiante, por lo que puedo estar equivocado, no dude en aconsejarme.
smc
8
  1. Divida la entrada en palabras, una por línea.
  2. Ordene la lista resultante de palabras (líneas).
  3. Aplastar múltiples ocurrencias.
  4. Ordenar por recuento de ocurrencias.

Para dividir la entrada en palabras, reemplace cualquier carácter que considere un separador de palabras por una nueva línea.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr
Gilles 'SO- deja de ser malvado'
fuente
Esta es una buena respuesta porque puede manejar el caso en el que las palabras están directamente al lado de alguna puntuación que no se debe ignorar.
David Grayson
5

No utilizo grep y awk pero parece hacer lo que quiere:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of
Bram
fuente
1
Esto no funcionará si la entrada contiene comodines de shell (es necesario agregar set -f) y trata la puntuación como parte de las palabras (que se pueden corregir de manera incómoda agregando caracteres de puntuación a IFS- buena suerte tratando de admitir conjuntos de caracteres no ASCII). Esto no será bueno con archivos de entrada muy grandes, ya que almacena todo el archivo en la memoria ( sortes más inteligente).
Gilles 'SO- deja de ser malvado'
2

Creo que buscas algo como esto?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

por supuesto, también puedes hacer lo mismo awk:)

amitkr
fuente
2

Usando awk/sort/uniqsolución:

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr
Príncipe John Wesley
fuente
¡Hermosa! Esto funcionó a la perfección.
stidmatt
0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

ordena ascendente después de dividir el archivo en palabras.

El grep simple encontrará fishenfisheye , por lo que debe mejorar el comando grep para evitar coincidencias parciales.

Toma alrededor de 3 segundos para un archivo de texto de 25k en una máquina en las edades, HDD clásico (IDE).

Para archivos más grandes o operaciones realizadas con frecuencia, un enfoque de mapa hash sería mejor, pero para un trabajo que rara vez se ejecuta o solo archivos más pequeños, podría ser suficiente.

usuario desconocido
fuente