2013-03-14 9 views
5

Supponiamo che io sono file di text.txt come di seguito:Elenca tutte le parole in un file di testo con conteggi di occorrenza?

she likes cats, and he likes cats too.

Vorrei che il mio risultato a guardare come:

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

Se mettere space , . in esso renderebbe gli script più facile, che sarebbe bene.

C'è una semplice pipeline di shell che potrebbe raggiungere questo obiettivo?

+0

Se la frase era "Uno dei miei gatti pesa 500 libbre, quel gatto è super-dimensionato!" - è quel conteggio del gatto più un conteggio di gatti o qualcos'altro? c'è una parola "s" da contare in quella frase? C'è una parola "500" e una parola "lbs" o una parola "500 lbs" o qualcos'altro? C'è una parola "super" e una parola "graduata" o una parola "super-dimensionata"? –

risposta

18

Ecco una battuta vicino e caro al mio cuore:

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

La punteggiatura sed strisce (sintonizzarsi regex a piacere), il TR mette la sola parola risultati per riga.

+0

Sei fantastico! – JackWM

+1

Quindi, con tutti i mezzi, premi il pulsante con il segno di spunta. – phs

+0

@phs +1 per buona attitudine! e umorismo. –

0

con GNU awk si può solo specificare il separatore Record (RS) di essere qualsiasi sequenza di caratteri non alfabetici:

$ 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 

ma che non risolverà il problema di come identificare le "parole" a generale.