it-swarm.com.de

Wie erstelle ich eine Häufigkeitsliste für jedes Word in einer Datei?

Ich habe eine Datei wie diese:

This is a file with many words.
Some of the words appear more than once.
Some of the words only appear one time.

Ich möchte eine zweispaltige Liste erstellen. Die erste Spalte zeigt, welche Wörter angezeigt werden, die zweite Spalte zeigt, wie oft sie erscheinen, zum Beispiel:

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
words3
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected] 
  • Um die Arbeit zu vereinfachen, entferne ich vor der Verarbeitung der Liste alle Satzzeichen und wandle den gesamten Text in Kleinbuchstaben um.
  • Wenn es keine einfache Lösung gibt, können words und Word als zwei separate Wörter gezählt werden.

Bisher habe ich folgendes:

sed -i "s/ /\n/g" ./file1.txt # put all words on a new line
while read line
do
     count="$(grep -c $line file1.txt)"
     echo $line"@"$count >> file2.txt # add Word and frequency to file
done < ./file1.txt
sort -u -d # remove duplicate lines

Aus irgendeinem Grund wird nach jedem Wort nur "0" angezeigt.

Wie kann ich eine Liste aller Words, die in einer Datei angezeigt werden, zusammen mit Informationen zur Häufigkeit generieren?

29
Village

Nicht sed und grep, sondern tr, sort, uniq und awk:

% (tr ' ' '\n' | sort | uniq -c | awk '{print $2"@"$1}') <<EOF
This is a file with many words.
Some of the words appear more than once.
Some of the words only appear one time.
EOF

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
54
eduffy

uniq -c macht schon was Sie wollen, sortieren Sie einfach die Eingabe:

echo 'a s d s d a s d s a a d d s a s d d s a' | tr ' ' '\n' | sort | uniq -c

ausgabe:

  6 a
  7 d
  7 s
34
Bohdan

Inhalt der Eingabedatei

$ cat inputFile.txt
This is a file with many words.
Some of the words appear more than once.
Some of the words only appear one time.

sed | sort | uniq verwenden

$ sed 's/\.//g;s/\(.*\)/\L\1/;s/\ /\n/g' inputFile.txt | sort | uniq -c
      1 a
      2 appear
      1 file
      1 is
      1 many
      1 more
      2 of
      1 once
      1 one
      1 only
      2 some
      1 than
      2 the
      1 this
      1 time
      1 with
      3 words

uniq -ic zählt und ignoriert die Groß-/Kleinschreibung, die Ergebnisliste enthält jedoch This anstelle von this.

5
Rony

Lass uns AWK verwenden!

Diese Funktion listet die Häufigkeit jedes Words in der bereitgestellten Datei in absteigender Reihenfolge auf: 

function wordfrequency() {
  awk '
     BEGIN { FS="[^a-zA-Z]+" } {
         for (i=1; i<=NF; i++) {
             Word = tolower($i)
             words[Word]++
         }
     }
     END {
         for (w in words)
              printf("%3d %s\n", words[w], w)
     } ' | sort -rn
}

Sie können es in Ihrer Datei so aufrufen:

$ cat your_file.txt | wordfrequency

Quelle: AWK-Station Ruby

3
Sheharyar

Das könnte für Sie funktionieren:

tr '[:upper:]' '[:lower:]' <file |
tr -d '[:punct:]' |
tr -s ' ' '\n' | 
sort |
uniq -c |
sed 's/ *\([0-9]*\) \(.*\)/\[email protected]\1/'
2
potong

Lass es uns in Python 3 tun!

"""Counts the frequency of each Word in the given text; words are defined as
entities separated by whitespaces; punctuations and other symbols are ignored;
case-insensitive; input can be passed through stdin or through a file specified
as an argument; prints highest frequency words first"""

# Case-insensitive
# Ignore punctuations `[email protected]#$%^&*()_-+={}[]\|:;"'<>,.?/

import sys

# Find if input is being given through stdin or from a file
lines = None
if len(sys.argv) == 1:
    lines = sys.stdin
else:
    lines = open(sys.argv[1])

D = {}
for line in lines:
    for Word in line.split():
        Word = ''.join(list(filter(
            lambda ch: ch not in "`[email protected]#$%^&*()_-+={}[]\\|:;\"'<>,.?/",
            Word)))
        Word = Word.lower()
        if Word in D:
            D[Word] += 1
        else:
            D[Word] = 1

for Word in sorted(D, key=D.get, reverse=True):
    print(Word + ' ' + str(D[Word]))

Nennen wir dieses Skript "frequency.py" und fügen Sie eine Zeile zu "~/.bash_aliases" hinzu:

alias freq="python3 /path/to/frequency.py"

Um die Häufigkeitswörter in Ihrer Datei "content.txt" zu finden, müssen Sie Folgendes tun:

freq content.txt

Sie können auch die Ausgabe dorthin weiterleiten:

cat content.txt | freq

Und analysieren Sie sogar Text aus mehreren Dateien:

cat content.txt story.txt article.txt | freq

Wenn Sie Python 2 verwenden, ersetzen Sie es einfach

  • ''.join(list(filter(args...))) mit filter(args...)
  • python3 mit python
  • print(whatever) mit print whatever
2
John Red

Sie können tr dafür verwenden, einfach ausführen

tr ' ' '\12' <NAME_OF_FILE| sort | uniq -c | sort -nr > result.txt

Beispielausgabe für eine Textdatei mit Städtenamen:

3026 Toronto
2006 Montréal
1117 Edmonton
1048 Calgary
905 Ottawa
724 Winnipeg
673 Vancouver
495 Brampton
489 Mississauga
482 London
467 Hamilton
1
Jerin A Mathews

Die Sortierung erfordert GNU AWK (gawk). Wenn Sie eine andere AWK ohne asort() haben, kann diese leicht angepasst und dann an sort geleitet werden.

awk '{gsub(/\./, ""); for (i = 1; i <= NF; i++) {w = tolower($i); count[w]++; words[w] = w}} END {qty = asort(words); for (w = 1; w <= qty; w++) print words[w] "@" count[words[w]]}' inputfile

Auf mehrere Zeilen aufgeteilt:

awk '{
    gsub(/\./, ""); 
    for (i = 1; i <= NF; i++) {
        w = tolower($i); 
        count[w]++; 
        words[w] = w
    }
} 
END {
    qty = asort(words); 
    for (w = 1; w <= qty; w++)
        print words[w] "@" count[words[w]]
}' inputfile
1
  awk '{ 
       BEGIN{Word[""]=0;}
    {
    for (el =1 ; el <= NF ; ++el) {Word[$el]++ }
    }
 END {
 for (i in Word) {
        if (i !="") 
           {
              print Word[i],i;
           }
                 }
 }' file.txt | sort -nr
0
Dani Konoplya
#!/usr/bin/env bash

declare -A map 
words="$1"

[[ -f $1 ]] || { echo "usage: $(basename $0 wordfile)"; exit 1 ;}

while read line; do 
  for Word in $line; do 
    ((map[$Word]++))
  done; 
done < <(cat $words )

for key in ${!map[@]}; do 
  echo "the Word $key appears ${map[$key]} times"
done|sort -nr -k5
0
GL2014