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 ..
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 lignegrep -v "^\s*$"
coupe les lignes videssort
pour préparer comme entrée pour uniq
uniq -c
pour compter les occurrencessort -bnr
trie dans l'ordre inverse numérique tout en ignorant les espacessensationnel. 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
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
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 :)
En utilisant awk/sort/uniq
Solution:
awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr
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.