2013-03-14 13 views
5

Załóżmy, że mam plik text.txt jak poniżej:Lista wszystkich słów w pliku tekstowym z liczbą wystąpień?

she likes cats, and he likes cats too.

chciałbym mój wynik wyglądał:

she 1 
likes 2 
cats 2 
and 1 
he 1 
too 1 

Jeżeli umieszczenie space , . do niego uczyniłoby skrypty łatwiejsze, że byłoby w porządku.

Czy istnieje prosty rurociąg osłonowy, który mógłby to osiągnąć?

+0

Jeśli fraza brzmiała: "Jeden z moich kotów waży 500 kg, ten kot jest bardzo duży!" - czy to liczba kotów plus jedna liczba kotów czy coś innego? czy istnieje słowo "s", które należy policzyć w tym zdaniu? Czy istnieje słowo "500" i słowo "lbs" lub słowo "500lbs" lub coś innego? Czy istnieje słowo "super" i słowo "size" lub słowo "super-size"? –

Odpowiedz

18

Oto jedna wkładka bliskich memu sercu:

cat text.txt | sed 's|[,.]||g' | tr ' ' '\n' | sort | uniq -c 

sed paski interpunkcyjny (melodia regex do smaku), TR umieszcza wyniki jedno słowo w wierszu.

+0

Jesteś świetny! – JackWM

+1

Następnie za wszelką cenę naciśnij ten przycisk znacznika wyboru. – phs

+0

@phs +1 dla dobrego nastawienia! i humor. –

0

Z GNU awk można po prostu określić Record Separator (RS) za dowolny ciąg znaków spoza alfabetu:

$ gawk -v RS='[^[:alpha:]]+' '{sum[$0]++} END{for (word in sum) print word,sum[word]}' file 
she 1 
likes 2 
and 1 
too 1 
he 1 
cats 2 

ale to nie rozwiąże problemu, jak rozpoznać „Słowa” w generał.