Zliczanie wystąpień słowa w pliku tekstowym

31

Mam plik tekstowy zawierający tweety i muszę policzyć, ile razy słowo jest wspomniane w tweecie. Na przykład plik zawiera:

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?

Powiedzmy, że chcę policzyć, ile razy w pliku wspomniane jest słowo iPhone. Oto co próbowałem.

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

to z pewnością działa, ale jestem zdezorientowany co do polecenia „wc” w unixie. Jaka jest różnica, jeśli spróbuję:

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

gdzie zamiast tego używane jest -c? Oba dają różne wyniki w dużym pliku pełnym tweetów i jestem zdezorientowany, jak to działa. Która metoda jest prawidłowym sposobem liczenia zdarzenia?

Maxxx
źródło
cut -f1tnie na kartach, co niewiele tu robi. Czy na pewno wc -ldaje to prawidłową liczbę? Pokazuje tutaj 2, ale liczę 3 wystąpienia „iPhone'a”.
Jeff Schaller
Inna technika: unix.stackexchange.com/q/39039/117549
Jeff Schaller
Również podobny: unix.stackexchange.com/q/60727/117549
Jeff Schaller

Odpowiedzi:

54

Biorąc pod uwagę taki wymóg, użyłbym GNU grep (dla -oopcji ), a następnie przekazałem go, wcaby policzyć całkowitą liczbę wystąpień:

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

Zwykły grep -cw danych policzy liczbę pasujących wierszy , a nie całkowitą liczbę pasujących słów . Użycie tej -oopcji powoduje, że grep wypisuje każde dopasowanie w linii on-line, bez względu na to, ile razy dopasowanie jest w linii.

wc -lnakazuje wcnarzędziu policzyć liczbę linii. Po wstawieniu przez grep każdego dopasowania do osobnego wiersza, jest to całkowita liczba wystąpień słowa na wejściu.


Jeśli GNU grep nie jest dostępny (lub pożądany), możesz przekształcić dane wejściowe trtak, aby każde słowo znajdowało się w osobnej linii, a następnie użyj, grep -caby policzyć:

$ tr '[:space:]' '[\n*]' < Tweet_Data | grep -i -c iphone
3
Jeff Schaller
źródło
1

Najłatwiejszą metodą jest

grep -wc "your_text" FileName

dla ciebie to będzie,

grep -wc "iPhone" Tweet_Data
Silent Spectator
źródło
Bardzo czysta odpowiedź, jeśli dopasujesz słowo takie jak „fajne”, dopasujesz tylko fajne, a NIE ccooll, więc pamiętaj, że spacje wokół słowa mają znaczenie.
jasonleonhard
1
Wynik będzie niepoprawny, gdy słowo pojawi się więcej niż jeden raz w linii.
hek2mgl