Ich möchte die häufigsten Wörter in einer Textdatei finden, indem ich eine Stoppwörterliste verwende. Ich habe bereits diesen Code:
tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10 > test.txt
aus einem alten Post
aber meine Datei enthält so etwas:
240
21 ipsum
20 Lorem
11 Textes
9 Blindtexte
7 Text
5 F
5 Blindtext
4 Texte
4 Buchstaben
Das erste ist nur ein Leerzeichen und im Text sind es Satzzeichen (wie Punkte), aber das möchte ich nicht, also was muss ich hinzufügen?
Akzeptierte Antwort:
Betrachten Sie diese Testdatei:
$ cat text.txt
this file has "many" words, some
with punctuation. some repeat,
many do not.
So erhalten Sie eine Wortanzahl:
$ grep -oE '[[:alpha:]]+' text.txt | sort | uniq -c | sort -nr
2 some
2 many
1 words
1 with
1 this
1 repeat
1 punctuation
1 not
1 has
1 file
1 do
Wie es funktioniert
-
grep -oE '[[:alpha:]]+' text.txt
Dies gibt alle Wörter abzüglich Leerzeichen oder Satzzeichen mit einem Wort pro Zeile zurück.
-
sort
Dies sortiert die Wörter in alphabetischer Reihenfolge.
-
uniq -c
Dabei wird gezählt, wie oft jedes Wort vorkommt. (Für
uniq
um zu funktionieren, muss seine Eingabe sortiert sein.) -
sort -nr
Dadurch wird die Ausgabe numerisch sortiert, sodass das häufigste Wort ganz oben steht.
Umgang mit gemischten Fällen
Betrachten Sie diese gemischte Testdatei:
$ cat Text.txt
This file has "many" words, some
with punctuation. Some repeat,
many do not.
Wenn wir some
zählen wollen und Some
genauso:
$ grep -oE '[[:alpha:]]+' Text.txt | sort -f | uniq -ic | sort -nr
2 some
2 many
1 words
1 with
1 This
1 repeat
1 punctuation
1 not
1 has
1 file
1 do
Hier haben wir das -f
hinzugefügt Option zum sort
damit Groß- und Kleinschreibung und das -i
ignoriert werden Option zu uniq
damit auch die Groß-/Kleinschreibung ignoriert wird.
Stoppwörter ausgenommen
Angenommen, wir möchten diese Stoppwörter aus der Zählung ausschließen:
$ cat stopwords
with
not
has
do
Also fügen wir grep -v
hinzu um diese Wörter zu eliminieren:
$ grep -oE '[[:alpha:]]+' Text.txt | grep -vwFf stopwords | sort -f | uniq -ic | sort -nr
2 some
2 many
1 words
1 This
1 repeat
1 punctuation
1 file