Zählen von Wortvorkommen in einer Textdatei

31

Ich habe eine Textdatei mit Tweets und muss zählen, wie oft ein Wort im Tweet erwähnt wird. Zum Beispiel enthält die Datei:

Apple iPhone X is going to worth a fortune
The iPhone X is Apple's latest flagship iPhone. How will it pit against it's competitors?

Angenommen, ich möchte zählen, wie oft das Wort iPhone in der Datei erwähnt wird. Also hier ist, was ich versucht habe.

cut -f 1 Tweet_Data | grep -i "iPhone" | wc -l

es funktioniert auf jeden Fall, aber ich bin verwirrt über den Befehl 'wc' in Unix. Was ist der Unterschied, wenn ich etwas probiere wie:

cut -f 1 Tweet_Data | grep -c "iPhone"

Wo wird stattdessen -c verwendet? Beide ergeben unterschiedliche Ergebnisse in einer großen Datei voller Tweets und ich bin verwirrt darüber, wie es funktioniert. Mit welcher Methode kann das Vorkommen richtig gezählt werden?

Maxxx
quelle
cut -f1schneidet auf der Basis von Tabs, was hier nicht viel bringt. Sind Sie sicher, wc -ldass Sie wirklich die richtige Anzahl erhalten? Es würde hier 2 anzeigen, aber ich zähle 3 Instanzen von "iPhone".
Jeff Schaller
Eine andere Technik: unix.stackexchange.com/q/39039/117549
Jeff Schaller
Ebenfalls ähnlich: unix.stackexchange.com/q/60727/117549
Jeff Schaller

Antworten:

54

In Anbetracht einer solchen Anforderung würde ich ein GNU-grep (für die -oOption ) verwenden und es dann durchlaufen, wcum die Gesamtzahl der Vorkommen zu zählen:

$ grep -o -i iphone Tweet_Data | wc -l
3

Anhand grep -cder Daten wird die Anzahl der übereinstimmenden Zeilen gezählt , nicht die Gesamtzahl der übereinstimmenden Wörter . Mit der -oOption wird grep angewiesen, jede Übereinstimmung in der eigenen Zeile auszugeben, unabhängig davon, wie oft sich die Übereinstimmung in der Zeile befindet.

wc -lWeist das wcDienstprogramm an, die Anzahl der Zeilen zu zählen. Nachdem grep jede Übereinstimmung in eine eigene Zeile gestellt hat, ist dies die Gesamtzahl der Vorkommen des Wortes in der Eingabe.


Wenn GNU grep nicht verfügbar ist (oder gewünscht wird), können Sie die Eingabe trso transformieren , dass jedes Wort in einer eigenen Zeile steht. Verwenden Sie dann grep -czum Zählen:

$ tr '[:space:]' '[\n*]' < Tweet_Data | grep -i -c iphone
3
Jeff Schaller
quelle
1

Die einfachste Methode ist,

grep -wc "your_text" FileName

für sie wird es sein,

grep -wc "iPhone" Tweet_Data
Stiller Zuschauer
quelle
Sehr saubere Antwort, aber wenn Sie ein Wort wie "cool" finden, werden Sie nur "cool" finden und NICHT "cooll". Denken Sie also daran, dass Leerzeichen um das Wort eine Rolle spielen.
Jasonleonhard
1
Das Ergebnis ist falsch, wenn das Wort mehrmals in einer Zeile vorkommt.
hek2mgl