PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Statistik-Krempel mit awk



SeeksTheMoon
27-10-2005, 16:04
Wie kann ich mit awk die Häufigkeit von Wörtern in einem Text ermitteln?
Wie kann ich mit awk die Häufigkeit von Buchstaben in einem Text ermitteln?

Die Doku von awk erschlägt mich leider, anstatt mir zu helfen...

Der Hammer kommt dann noch: Die häufigsten Buchstabenpaare und -tripel im Text finden... :-/

peschmae
27-10-2005, 17:29
Naja, k.A. von AWK, naja, fast keine.

Also besser was anderes. Auch ok?

1)
cat text | sed "s# #\n#g" | grep $WORT | wc -l

2)
cat text | sed "s#\(.\)#\1\n#" | grep $WORT | wc -l

oder so ähnlich

Der Hammer - ähm, tja, schon was schwieriger. Da musst du ja wie verrückt rumiterieren, oder? Da würd ich wohl ein "richtiges" Programm schreiben dafür.

MfG Peschmä

Joghurt
27-10-2005, 19:48
Darf's auch Python sein?

hist={}

import re

# Wörter
#searchre = re.compile(r"\w+",re.LOCALE)
#fuer englische Texte besser:
#searchre = re.compile(r"[-a-zA-Z']+")

# Buchstabenpaare
#searchre = re.compile(r"\w(?=\w)",re.LOCALE)

# Buchstabentriplets
searchre = re.compile(r"\w(?=\w\w)",re.LOCALE)

for line in open("textfile"):
for x in searchre.finditer(line):
# +0 bei Wörtern (kein Lookahead)
# +1 bei Paaren (Lookahead von einem Zeichen)
# +2 bei Tripeln (Lookahead von zwei Zeichen)
match = line[x.start(0):x.end(0)+2].lower()
# Zählen
try:
hist[match] += 1
except KeyError:
hist[match] = 1

# Dictionary als Liste von (key,value)-Paaren
res = hist.items()

# sortieren, allerdings nach dem zweiten Eintrag und nicht nach dem ersten
res.sort(lambda a,b:-cmp(a[1],b[1]))

# Ausgabe
for x,n in res:
print "%8i %s"%(n,x)

Romanday
27-10-2005, 22:13
Wie kann ich mit awk die Häufigkeit von Wörtern in einem Text ermitteln?
Wie kann ich mit awk die Häufigkeit von Buchstaben in einem Text ermitteln?

Die Doku von awk erschlägt mich leider, anstatt mir zu helfen...

Der Hammer kommt dann noch: Die häufigsten Buchstabenpaare und -tripel im Text finden... :-/

Muß es den unbedingt awk||sed sein?

cat micki_mouse.h | wc -l

SeeksTheMoon
28-10-2005, 10:15
ja, muss leider awk sein - oder auch etwas anderes das man auf jedem Unix-System findet. Moderne Scriptsprachen wie Perl/Python und Co fallen deshalb leider weg.

Ein paar Sachen habe ich schon mit Shellscripten gemacht, aber die brauchen wegen Arrays und vielen Kommandoaufrufen rund 2 Minuten und das suckt ziemlich... :-/
awk ist die einzige mir bekannte Sprache die außer Shellscripten in Frage käme.
awk wird auch explizit vorgeschlagen...

Romanday
28-10-2005, 19:19
ja, muss leider awk sein - oder auch etwas anderes das man auf jedem Unix-System findet. Moderne Scriptsprachen wie Perl/Python und Co fallen deshalb leider weg.

Ein paar Sachen habe ich schon mit Shellscripten gemacht, aber die brauchen wegen Arrays und vielen Kommandoaufrufen rund 2 Minuten und das suckt ziemlich... :-/
awk ist die einzige mir bekannte Sprache die außer Shellscripten in Frage käme.
awk wird auch explizit vorgeschlagen...

In awk bekommst Du auf jeden Fall Ärger mit Sonderzeichen.
Das klaut dir viel Zeit.
Vielleicht ist es sogar besser dein Programm gleich in C zu schreiben.

SeeksTheMoon
29-10-2005, 08:11
in dem Text sind keine Sonderzeichen, die habe ich vorher schon rausgefiltert.
Da ich das für eine f**king Übungsaufgabe brauche, kann ich das leider nicht in C oder einer "neueren" Scriptsprache schreiben, sondern muss dazu Unix-Systemkommandos benutzen.

("Einführung in Unix" nennt sich das - LOL. Ich kann dank Ausbildung und jahrelanger Erfahrung mit Unix hervorragend umgehen, aber so einen Statistik-Müll musste ich noch nie machen. Was machen die anderen Studenten ohne Info-Ausbildung? Sich den Kopfschuss setzen? Und wer denkt sich so einen praxisfernen Schrott aus? Fragen über Fragen :D)

btw: Normalerweise wäre C auch angebracht, da einige der Scripte 2 Minuten an dem Text rumrödeln, was ich für einen Praxiseinsatz als suboptimal einstufen würde. Aber die Aufgabenstellung hat ja schon gezeigt dass es offenbar auf Praxisferne mit maximaler Schwierigkeit ankommt :rolleyes:

Romanday
29-10-2005, 08:40
("Einführung in Unix" nennt sich das - LOL. Ich kann dank Ausbildung und jahrelanger Erfahrung mit Unix hervorragend umgehen, aber so einen Statistik-Müll musste ich noch nie machen. Was machen die anderen Studenten ohne Info-Ausbildung? Sich den Kopfschuss setzen? Und wer denkt sich so einen praxisfernen Schrott aus? Fragen über Fragen :D)

btw: Normalerweise wäre C auch angebracht, da einige der Scripte 2 Minuten an dem Text rumrödeln, was ich für einen Praxiseinsatz als suboptimal einstufen würde. Aber die Aufgabenstellung hat ja schon gezeigt dass es offenbar auf Praxisferne mit maximaler Schwierigkeit ankommt :rolleyes:

Zu beneiden bist du nicht.
Dein Script wird relativ groß, da Du dir einige
Hilfsfunktionen schreiben mußt.

Hat du hier schon nachgeschaut?
http://www.gnu.org/software/gawk/manual/gawk.html

Joghurt
29-10-2005, 11:12
Wenn du die ganze Unixtoolchain nutzen darfst, kannst du es so machen:

awk '{for(n=1;n<=NF;n++) print tolower($n)}' DATEI|sed 's/[^a-z]//g'|egrep "[a-z]"|sort|uniq -c|sort -rnHoffnungslos ineffizient, aber besser als nichts. (Der egrep verhindert, dass leere Zeilen (wenn z.B. geplenkt wurde) gezählt werden.

Die Buchstabenverteilung kannst du so zählen:
Dupletts zählen ginge mit:
awk '{for(n=0;n<length($0);n++) print tolower(substr($0,n,2));}' DATEI|egrep "^[a-z]+$"|sort|uniq -c|sort -nrHTH

So vollkommen praxisfern ist es nicht, man könnte z.B. einen kleinen Spamdetektor (mit hoher Fehlerquote ;)) damit machen. Also nur 99% praxisfern. :D

Romanday
29-10-2005, 11:45
So vollkommen praxisfern ist es nicht, man könnte z.B. einen kleinen Spamdetektor (mit hoher Fehlerquote ;)) damit machen. Also nur 99% praxisfern. :D

Soll er nicht alles in awk coden?
Also ohne egrep, unique, sort etc...? :confused:

Joghurt
29-10-2005, 11:47
Soll er nicht alles in awk coden?Daher mein errster Satz.

SeeksTheMoon
30-10-2005, 09:22
nein, nicht alles, aber für die komplexen Sachen ist awk meiner Meinung nach entweder aus Mächtigkeits- oder Geschwindigkeitsgründen die einzige Wahl.
Danke schonmal für die Beispiele, ich werde mir das jetzt alles genau ansehen und dann diese freakige Aufgabe abschließen.
Falls ich dann noch Fragen hab, weiß ich ja wo ich posten kann :D

Joghurt
30-10-2005, 10:59
Normalerweise legst du ein dictionary/map an, in der du jedes Wort zählst, also in awk: NameDesArrays[WORT] += 1.
Das Problem ist nur nachher, dass sämtliche awk-interne sort-Funktionen nicht POSIX-kompatibel, sondern GNU Erweiterungen sind. In dem Falle wirst du eh auf das externe sort ausweichen müssen.