web-dev-qa-db-fra.com

Obtenez le nombre d'occurrences de mots dans tous les mots et imprimez les fichiers triés

J'avais une commande qui fonctionnerait à travers un fichier texte, compterait toutes les occurrences des mots et l'imprimerait comme ceci:

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

Il ne recherche donc pas ligne par ligne, mais mot par mot, et il le fait pour tous les mots, pas seulement pour 1 mot. Je l'avais trouvé quelque part sur les internets il y a longtemps, mais je ne peux pas le trouver ou m'en souvenir ..

29
user2909

J'utiliserais tr au lieu de awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr remplace simplement les espaces par des retours à la ligne
  • grep -v "^\s*$" coupe les lignes vides
  • sort pour préparer comme entrée pour uniq
  • uniq -c pour compter les occurrences
  • sort -bnr trie dans l'ordre inverse numérique tout en ignorant les espaces

sensationnel. il s'est avéré être une excellente commande pour compter jure par ligne

trouver . -name "* .py" -exec cat {} \; | tr '[: espace:]' '[\ n *]' | grep -v "^\s * $" | trier | uniq -c | sort -bnr | grep baise

34
seler
  1. Divisez l'entrée en mots, un par ligne.
  2. Triez la liste résultante de mots (lignes).
  3. Écraser plusieurs occurrences.
  4. Trier par nombre d'occurrences.

Pour diviser l'entrée en mots, remplacez tout caractère que vous jugez être un séparateur de mots par une nouvelle ligne.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them Word constituents
sort |
uniq -c |
sort -nr

Ne pas utiliser grep et awk mais cela semble faire ce que vous voulez:

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
5
Bram

Je crois que tu veux quelque chose comme ça?

$ 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

bien sûr, vous pouvez faire la même chose avec awk aussi :)

2
amitkr

En utilisant awk/sort/uniq Solution:

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr
2
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 

trie croissant après avoir divisé le fichier en mots.

Le grep simple trouvera fish dans fisheye, vous devez donc améliorer la commande grep pour empêcher les correspondances partielles.

Prend environ 3 secondes pour un fichier texte de 25k sur une machine de tous les temps, disque dur classique (IDE).

Pour les fichiers plus gros ou les opérations souvent effectuées, une approche de carte de hachage serait préférable, mais pour un travail rarement exécuté ou pour des fichiers plus petits uniquement, cela pourrait être suffisant.

0
user unknown