it-swarm.com.de

Wie zählt man die Gesamtzahl der Wörter in einer Datei?

Ich suche nach einem Befehl, um die Anzahl aller Wörter in einer Datei zu zählen. Zum Beispiel, wenn eine Datei so ist,

today is a 
good day

dann sollte es 5 drucken, da dort 5 Wörter sind.

18
Richard

Der Befehl wc aka. Word Count kann es tun:

$ wc -w <file>

beispiel

$ cat sample.txt
today is a 
good day


$ wc -w sample.txt
5 sample.txt


# just the number (thanks to Stephane Chazelas' comment)
$ wc -w < sample.txt
5
40
slm

Ich habe mir das für NUR die Nummer ausgedacht:

wc -w [file] | cut -d' ' -f1

5

Ich mag auch die wc -w < [file] Ansatz

Um nur die Anzahl der Wörter in einer Variablen zu speichern, können Sie Folgendes verwenden:

myVar=($(wc -w /path/to/file))

Auf diese Weise können Sie den Dateinamen elegant überspringen.

7
Michael Durrant

Das Programm wc zählt "Wörter", aber dies sind beispielsweise nicht die "Wörter", die viele Leute sehen würden, wenn sie eine Datei untersuchen. Das Programm vi verwendet zum Beispiel ein anderes Maß für "Wörter" und begrenzt sie basierend auf ihren Zeichenklassen, während wc einfach Dinge zählt durch Leerzeichen getrennt . Die beiden Maßnahmen können sich radikal unterscheiden. Betrachten Sie dieses Beispiel:

first,second

vi sieht drei Wörter ( first und second as sowie das Komma, das sie trennt), während wc eins sieht (in dieser Zeile befindet sich kein Leerzeichen). Es gibt viele Möglichkeiten, Wörter zu zählen, einige sind weniger nützlich als andere.

Während Perl besser geeignet wäre, einen Zähler für die Wörter im vi-Stil zu schreiben, finden Sie hier ein kurzes Beispiel mit sed, tr und wc (mäßig portabel mit wörtlichen Zeilenumbrüchen ^M):

#!/bin/sh
in_words="[[:alnum:]_]"
in_punct="[][{}\\|:\"';<>,./?\`[email protected]#$%^&*()+=-]"
sed     -e "s/\($in_words\)\($in_punct\)/\1^M\2/g" \
        -e "s/\($in_punct\)\($in_words\)/\1^M\2/g" \
        -e "s/[[:space:]]/^M/g" \
        "[email protected]" |
tr '\r' '\n' |
sed     -e '/^$/d' |
wc      -l

Vergleiche vergleichen:

  • Wenn ich das Skript selbst ausführe, habe ich 76 Wörter.
  • Das Beispiel in Perl von @cuonglm ergibt 31.
  • Die Verwendung von wc ergibt 28.

Als Referenz sagt POSIX vi :

Im POSIX-Gebietsschema erkennt vi fünf Arten von Wörtern:

  1. Eine maximale Folge von Buchstaben, Ziffern und Unterstrichen, die an beiden Enden durch Folgendes begrenzt sind:

    • Andere Zeichen als Buchstaben, Ziffern oder Unterstriche

    • Der Anfang oder das Ende einer Zeile

    • Der Anfang oder das Ende des Bearbeitungspuffers

  2. Eine maximale Folge von anderen Zeichen als Buchstaben, Ziffern, Unterstrichen oder Zeichen, die an beiden Enden durch Folgendes begrenzt sind:

    • Ein Buchstabe, eine Ziffer, ein Unterstrich
    • <blank> Zeichen
    • Der Anfang oder das Ende einer Zeile
    • Der Anfang oder das Ende des Bearbeitungspuffers
  3. Eine oder mehrere aufeinanderfolgende Leerzeilen

  4. Das erste Zeichen im Bearbeitungspuffer

  5. Das letzte nicht - <newline> im Bearbeitungspuffer

3
Thomas Dickey

Verwenden wir AWK!

$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { Word = tolower($i) words[Word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn } 
$ cat your_file.txt | wordfrequency

Hier wird die Häufigkeit jedes Wortes aufgelistet, das in der bereitgestellten Datei vorkommt. Ich weiß, es ist nicht das, wonach Sie gefragt haben, aber es ist besser! Wenn Sie die Vorkommen Ihres Wortes sehen möchten, können Sie dies einfach tun:

$ cat your_file.txt | wordfrequency | grep yourword

Ich habe diese Funktion sogar zu meinen . Dotfiles hinzugefügt.


Quelle: AWK-ward Ruby

3
Sheharyar

Die bessere Lösung ist die Verwendung von Perl:

Perl -nle '$Word += scalar(split(/\s+/, $_)); END{print $Word}' filename

@ Bernhard

Sie können den Quellcode des Befehls wc von coreutils aus überprüfen, den ich auf meinem Computer mit der Datei subst.c In der Bash 4.2-Quelle teste.

time wc -w subst.c

real    0m0.025s
user    0m0.016s
sys     0m0.000s

Und

time Perl -nle '$Word += scalar(split(" ", $_)); END{print $Word}' subst.c

real    0m0.021s
user    0m0.016s
sys     0m0.004s

Je größer die Datei ist, desto effizienter ist Perl in Bezug auf wc.

3
cuonglm