2017-10-18 33 views
0

Je veux compter la fréquence des mots dans un texte littéraire "text.txt" sans compter les mots vides (à partir d'une liste appelée "stopwords.txt") en utilisant le terminal.Fréquence des mots sans mots vides utilisant egrep

cat text.txt | tr -sc 'A-Za-z' '\n' | tr 'A-Z' 'a-z' | egrep -vwFf stopwords.txt | sort | uniq -c 

Pourquoi cela ne fonctionne-t-il pas et quel devrait être le bon script?

Remarque: la sortie doit être triée de basse fréquence à haute!

+2

post-échantillon des fichiers de sortie d'entrée – 123

+0

Sur mon ordinateur, votre 'egrep -vwFf' renvoie l'erreur:' grep: matchers conflictuels spécifiés'. Le simple fait de retirer le 'F'flag corrige ceci pour moi. – Aserre

+0

@ Aserre c'est un bon point –

Répondre

0

Vous pouvez envisager d'utiliser awk de le faire avec un processus plutôt qu'un tuyau moins efficace:

$ awk 'BEGIN{RS="[^[:alpha:]]"} 
    /^$/{next} 
    {word=tolower($1)} 
    FNR==NR {stop[word]; next} 
    word in stop {next} 
    {wc[word]++} 
    END{ for (e in wc) printf "%4d\t%s\n", wc[e], e } 
    ' stopwords words 

(gawk seulement dans ce cas ...)

awk POSIX:

$ awk 'BEGIN{FS="[^[:alpha:]]"} 
    {for (i=1; i<=NF; i++){ 
     word=tolower($i) 
     if (FNR==NR) 
      stop[word] 
     else if (word in stop || $i~/^$/) 
      continue 
     else 
      wc[word]++ 
     } 
    } 
    END{ for (e in wc) printf "%4d\t%s\n", wc[e], e } 
    ' stopwords words 

Ensuite, votre «tuyau» peut être d'appeler sort sur cela avec | sort -n

+0

merci! ce serait une solution noce; mais je veux le faire avec des tuyaux ... –