Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Woerter zaehlen....

10 views
Skip to first unread message

Patrick Rudin

unread,
Mar 6, 2012, 4:26:31 PM3/6/12
to
Ich würde gerne mal eigene (und auch fremde) Texte auf die verwendete
Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc kenne ich, aber
fürs Zwischenspeichern und Sortieren mit anschliessendem Zählen fehlt
mir dann doch die nötige Bash-Erfahrung. Passende Skripte habe ich
bislang nirgends gesehen. Hat vielleicht jemand hier was passendes
rumliegen?

Konkretes Beispiel: Textfile enthält

***
Das ist richtig, völlig richtig und total völlig richtig!
***

Ausgabe des Skripts:

3 richtig
2 völlig
1 Das
1 ist
1 total
1 und

(alphanumerisches Zeugs kann man von mir aus ignorieren)

Ideen?


Grüsse

Patrick

Laurianne Gardeux

unread,
Mar 6, 2012, 4:56:43 PM3/6/12
to
Patrick Rudin:

> Ich würde gerne mal eigene (und auch fremde) Texte auf die verwendete
> Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc kenne ich, aber
> fürs Zwischenspeichern und Sortieren mit anschliessendem Zählen fehlt
> mir dann doch die nötige Bash-Erfahrung. Passende Skripte habe ich
> bislang nirgends gesehen. Hat vielleicht jemand hier was passendes
> rumliegen?


#! /bin/sh
# Read a text stream on standard input, and output a list of
# the n (default: 25) most frequently occurring words and
# their frequency counts, in order of descending counts, on
# standard output.
# gesehen auf: http://safari.java.net/0596005954/shellsrptg-CHP-5-SECT-4
#
# Usage:
# wordfrequence.sh [n] < mytext.txt

tr -cs A-Za-z\' '\n' | # Replace nonletters with newlines
tr A-Z a-z | # Map uppercase to lowercase
sort | # Sort the words in ascending order
uniq -c | # Eliminate duplicates, showing their counts
sort -k1,1nr -k2 | # Sort by descending count, and then by ascending word
sed ${1:-25}q # Print only the first n (default: 25) lines; see Chapter 3

Paul Hink

unread,
Mar 6, 2012, 4:58:36 PM3/6/12
to
Patrick Rudin <tax...@gmx.ch> wrote:

> Ich würde gerne mal eigene (und auch fremde) Texte auf die verwendete
> Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc kenne ich, aber
> fürs Zwischenspeichern und Sortieren mit anschliessendem Zählen fehlt
> mir dann doch die nötige Bash-Erfahrung. Passende Skripte habe ich
> bislang nirgends gesehen. Hat vielleicht jemand hier was passendes
> rumliegen?

Ein Einstieg könnte z. B. so etwas sein:

tr -d ',.!' | tr ' ' '\n' | sort | uniq -c | sort -n -r

Juergen P. Meier

unread,
Mar 7, 2012, 12:06:55 AM3/7/12
to
Laurianne Gardeux <l...@romandie.com>:
> tr -cs A-Za-z\' '\n' | # Replace nonletters with newlines
> tr A-Z a-z | # Map uppercase to lowercase
> sort | # Sort the words in ascending order
> uniq -c | # Eliminate duplicates, showing their counts
> sort -k1,1nr -k2 | # Sort by descending count, and then by ascending word

Soweit so gut.

> sed ${1:-25}q # Print only the first n (default: 25) lines; see Chapter 3

*patsch*

man head

Juergen
--
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Helmut Hullen

unread,
Mar 7, 2012, 2:19:00 AM3/7/12
to
Hallo, Laurianne,

Du meintest am 06.03.12:

> Patrick Rudin:

>> Ich würde gerne mal eigene (und auch fremde) Texte auf die
>> verwendete Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc
>> kenne ich, aber fürs Zwischenspeichern und Sortieren mit
>> anschliessendem Zählen fehlt mir dann doch die nötige
>> Bash-Erfahrung. Passende Skripte habe ich bislang nirgends gesehen.
>> Hat vielleicht jemand hier was passendes rumliegen?


> #! /bin/sh
> # Read a text stream on standard input, and output a list of
> # the n (default: 25) most frequently occurring words and
> # their frequency counts, in order of descending counts, on
> # standard output.
> # gesehen auf: http://safari.java.net/0596005954/shellsrptg-CHP-5-SEC
> T-4 #
> # Usage:
> # wordfrequence.sh [n] < mytext.txt

> tr -cs A-Za-z\' '\n' | # Replace nonletters with newlines
> tr A-Z a-z | # Map uppercase to lowercase

[...]

Ist für Texte mit (z.B.) Umlauten keine gute Lösung.

Viele Gruesse
Helmut

"Ubuntu" - an African word, meaning "Slackware is too hard for me".

Juergen Ilse

unread,
Mar 7, 2012, 4:15:09 AM3/7/12
to
Hallo,

Patrick Rudin <tax...@gmx.ch> wrote:
> Ich würde gerne mal eigene (und auch fremde) Texte auf die verwendete
> Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc kenne ich, aber
> fürs Zwischenspeichern und Sortieren mit anschliessendem Zählen fehlt
> mir dann doch die nötige Bash-Erfahrung. Passende Skripte habe ich
> bislang nirgends gesehen. Hat vielleicht jemand hier was passendes
> rumliegen?

Klingt fuer mich nach einem Einsatzzweck fuer ein kleines awk-script ...

awk '{ for (i=1; i<=NF; ++i) wort[$i]+=1; }
END for (i in wort) print i " : " wort[i]; }' datei

oder etwas in dieser Art. "Assoziative Arrays" wie awk sie bietet sind
hier ein einfach zu nutzendes Werkzeug ...

> Konkretes Beispiel: Textfile enthält
>
> ***
> Das ist richtig, völlig richtig und total völlig richtig!
> ***
>
> Ausgabe des Skripts:
>
> 3 richtig
> 2 völlig
> 1 Das
> 1 ist
> 1 total
> 1 und

Genaugenommen ist das nicht ganz korrekt, wenn man "!" als Zeichen eines
Wortes zulassen wuerde, denn dann wuerde sich folgendes ergeben:

~ $ awk '{ for (i=1;i<=NF;++i) wort[$i]+=1; } END { for (i in wort) print i " : " wort[i]; }'
***
Das ist richtig, völlig richtig und total völlig richtig!
***
richtig! : 1
total : 1
und : 1
richtig : 1
völlig : 2
richtig, : 1
ist : 1
Das : 1
*** : 2
~ $

> Ideen?

Zuerst einmal eine klare Spezifikation angeben, welche ZEichen denn Teil
eines Wortes sein koennen und welche fuer diese Betrachtung als eine Art
"whitespace zwischen den Worten" bei dieser Betrachtung zu ignorieren sind.

Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname ist nur ein Name, nicht mehr und nicht weniger.
Wer mehr hineininterpretiert, hat das Domain-Name-System nicht
verstanden.

David Haller

unread,
Mar 6, 2012, 8:09:31 PM3/6/12
to
On Tue, 06 Mar 2012 22:26:31, Patrick Rudin <tax...@gmx.ch> wrote:
> Ich würde gerne mal eigene (und auch fremde) Texte auf die verwendete
> Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc kenne ich, aber
> fürs Zwischenspeichern und Sortieren mit anschliessendem Zählen fehlt
> mir dann doch die nötige Bash-Erfahrung. Passende Skripte habe ich
> bislang nirgends gesehen. Hat vielleicht jemand hier was passendes
> rumliegen?
[..]
> Ideen?

awk '
{
gsub(/[^[:alnum:][:space:]]/, "");
for( i = 1; i <= NF; i++ ) {
words[tolower($i)]++;
}
}
END {
for(w in words) {
print words[w]"\t"w;
}
}' textfile | sort -n

Zumindest mit GNU awk klappt das auch gut mit Umlauten (bei alnum und
tolower()).

-dnh

--
Computers make very fast, very accurate mistakes.

Heiko Berges

unread,
Mar 9, 2012, 4:21:57 AM3/9/12
to
Juergen P. Meier wrote:
> Laurianne Gardeux <l...@romandie.com>:
>> tr -cs A-Za-z\' '\n' | # Replace nonletters with newlines
>> tr A-Z a-z | # Map uppercase to lowercase
>> sort | # Sort the words in ascending order
>> uniq -c | # Eliminate duplicates, showing their counts
>> sort -k1,1nr -k2 | # Sort by descending count, and then by ascending word
>
> Soweit so gut.
>
>> sed ${1:-25}q # Print only the first n (default: 25) lines; see Chapter 3
>
> *patsch*

http://utcc.utoronto.ca/~cks/space/blog/unix/HeadVsSed

Wenn man dem Link "more shell, less egg" in dem Artikel folgt, kommt
man lustigerweise zurück zum ursprünglichen Problem, seiner Lösung
von wem die ist und was uns der Autor damit sagen wollte.


scnr,
Heiko

Achim Peters

unread,
Mar 10, 2012, 9:20:21 AM3/10/12
to
Am 09.03.2012 10:21, schrieb Heiko Berges:
> Juergen P. Meier wrote:
>> Laurianne Gardeux <l...@romandie.com>:
>>> sed ${1:-25}q # Print only the first n (default: 25) lines; see Chapter 3
>>
>> *patsch*
>
> http://utcc.utoronto.ca/~cks/space/blog/unix/HeadVsSed
>
> Wenn man dem Link "more shell, less egg" in dem Artikel folgt, kommt
> man lustigerweise zurück zum ursprünglichen Problem, seiner Lösung

In einem Artikel von 2011 ein Script, was "das Alphabet" zur Erkennung
von Wörtern als "A-Za-z" definiert, explizit als "bug-free" zu
bewundern, hat was.

Was Amerikanisches, sozusagen ... ;-)

Bye
Achim

Juergen P. Meier

unread,
Mar 12, 2012, 1:02:25 AM3/12/12
to
Achim Peters <Achim...@gmx.de>:
Zumal Character-Ranges nur in der "C" bzw. "POSIX" locale definiert
sind, und ausserhalb von LC_ALL=C unspezifiziert und teils ueberraschend
Implementiert sind.

Wenn dann [:alpha:], [:lower:] oder [:upper:]

Christian Garbs

unread,
Mar 12, 2012, 4:18:15 PM3/12/12
to
Mahlzeit!

Patrick Rudin <tax...@gmx.ch> wrote:

> Ich würde gerne mal eigene (und auch fremde) Texte auf die verwendete
> Häufigkeit von Wörtern abklopfen. Simples Zählen mit wc kenne ich, aber
> fürs Zwischenspeichern und Sortieren mit anschliessendem Zählen fehlt
> mir dann doch die nötige Bash-Erfahrung. Passende Skripte habe ich
> bislang nirgends gesehen. Hat vielleicht jemand hier was passendes
> rumliegen?

$ info coreutils

aufrufen und dann runterscrollen[2] bis zur Überschrift "Opening the
software toolbox" und dort das Kapitel "Putting the tools together::"
lesen. Da kommt genau sowas wie Du brauchst als Beispiel vor.
Die umliegenden Kapitel sind auch nicht schlecht.

So habe ich damals[1] Shellprogrammierung gelernt, insbesondere das
kreative Zusammenketten mehrerer Programme.

Gruß
Christian

[1] Da waren das noch die textutils

[2] Ich kann mich mit der Bedienung von info(1) nicht ganz anfreunden
und habe deshalb auf meinen Rechnern pinfo(1) installiert, das
bedient sich ähnlich lynx(1) oder links(1).
--
....Christian.Garbs.....................................http://www.cgarbs.de
Programmieren ohne Doku ist wie Musikantenstadl ohne Mute-Taste.
(Martin Vorlaender in de.comp.lang.perl.misc)

Patrick Rudin

unread,
Mar 14, 2012, 1:42:48 PM3/14/12
to
Juergen Ilse wrote:
> Klingt fuer mich nach einem Einsatzzweck fuer ein kleines awk-script ...

Vielen Dank an alle für die ganzen Antworten, funktioniert soweit ganz
hübsch. Mag das jemand mal auf den letzten Monat des deutschsprachigen
Usenet anwenden? ;-)


Grüsse

Patrick

Patrick Rudin

unread,
Mar 14, 2012, 1:48:14 PM3/14/12
to
Christian Garbs wrote:
> So habe ich damals[1] Shellprogrammierung gelernt, insbesondere das
> kreative Zusammenketten mehrerer Programme.

Ich werds mal in Ruhe angucken.

Dummerweise habe ich als Teenager (ZX-81, C-64...) Basic programmiert,
später beruflich sogar Cobol-Zeugs warten müssen. Das muss irgendwie
mein Hirn kaputt gemacht haben, denn ich hab trotz mehrerer Anläufe in
den letzten Jahren (und vieler guter Tutorials im Netz) nicht so richtig
den Einstieg in die modernen Programmierwerkzeuge gefunden. Ein bisschen
Perl und Bash geht schon, aber ich brauche für simpelste Probleme
(Zeilenweises Einlesen von Dateien, simple Berechnungen,
Variablenrumschubsen, etc.) unendlich viel Zeit beim Suchen in den
Tutorials und gebe meist irgendwann wieder auf, auch weil ich die
gefundenen Beispiele oft nicht richtig verstehe. Ich kann nur
programmieren, wenn ich das Konzept dahinter kapiert habe.

Insofern: Falls jemand einen Lesetipp im Sinne von "Zielstrebiges
heutiges Programmieren für alte Basic-Schlampen" hat, bitte her damit...


Gruss

Patrick

Ulli Horlacher

unread,
Mar 18, 2012, 8:24:13 PM3/18/12
to
Patrick Rudin <tax...@gmx.ch> wrote:

> Dummerweise habe ich als Teenager (ZX-81, C-64...) Basic programmiert,

Jaja, die Jugendsuenden - wie bei mir :-)


> Insofern: Falls jemand einen Lesetipp im Sinne von "Zielstrebiges
> heutiges Programmieren für alte Basic-Schlampen" hat, bitte her damit...

Programming Perl, 4th Edition
By Tom Christiansen, brian d foy, Larry Wall, Jon Orwant
Publisher: O'Reilly Media
Released: February 2012

Hat den grossen Vorteil, dass man nur ein kleines Subset braucht um
anfangen zu koennen. Man muss nicht erst das ganze Buch gelesen haben.
Vieles ist optional. So kann man zB die ganze Objektorientierung (erst
mal) weg lassen.


--
Ullrich Horlacher Informationssysteme und Serverbetrieb
Rechenzentrum E-Mail: horl...@rus.uni-stuttgart.de
Universitaet Stuttgart Tel: ++49-711-685-65868
Allmandring 30 Fax: ++49-711-682357
70550 Stuttgart (Germany) WWW: http://www.rus.uni-stuttgart.de/

Holger Marzen

unread,
Mar 19, 2012, 2:12:01 AM3/19/12
to
* On Mon, 19 Mar 2012 00:24:13 +0000 (UTC), Ulli Horlacher wrote:

> Patrick Rudin <tax...@gmx.ch> wrote:
>
>> Dummerweise habe ich als Teenager (ZX-81, C-64...) Basic programmiert,
>
> Jaja, die Jugendsuenden - wie bei mir :-)
>
>
>> Insofern: Falls jemand einen Lesetipp im Sinne von "Zielstrebiges
>> heutiges Programmieren für alte Basic-Schlampen" hat, bitte her damit...
>
> Programming Perl, 4th Edition
> By Tom Christiansen, brian d foy, Larry Wall, Jon Orwant
> Publisher: O'Reilly Media
> Released: February 2012
>
> Hat den grossen Vorteil, dass man nur ein kleines Subset braucht um
> anfangen zu koennen. Man muss nicht erst das ganze Buch gelesen haben.
> Vieles ist optional. So kann man zB die ganze Objektorientierung (erst
> mal) weg lassen.

Eigentlich für immer :)

Patrick Rudin

unread,
Mar 19, 2012, 6:49:09 AM3/19/12
to
Holger Marzen wrote:
> Ulli Horlacher wrote:
>> Vieles ist optional. So kann man zB die ganze Objektorientierung (erst
>> mal) weg lassen.
>
> Eigentlich für immer :)

Natürlich kann man damit auch einfach prozedural programmieren. Aber um
Werkzeuge richtig einsetzen zu können, sollte man eigentlich das Konzept
dahinter verstanden haben.


Gruss

Patrick

Holger Marzen

unread,
Mar 19, 2012, 10:45:26 AM3/19/12
to
Nur wenn sie Probleme lösen, die man auch ohne sie hätte :)

Ulli Horlacher

unread,
Mar 20, 2012, 9:29:24 AM3/20/12
to
Patrick Rudin <tax...@gmx.ch> wrote:

(Perl)
> >> Vieles ist optional. So kann man zB die ganze Objektorientierung (erst
> >> mal) weg lassen.
> >
> > Eigentlich für immer :)
>
> Natürlich kann man damit auch einfach prozedural programmieren. Aber um
> Werkzeuge richtig einsetzen zu können, sollte man eigentlich das Konzept
> dahinter verstanden haben.

Da bei Perl objektorientierung kein zentrales Konzept ist, kann man es
auch einfach ignorieren. Waere jetzt zB bei Java weniger angebracht :-)

Wer von BASIC oder *sh her kommt, tut sich ohne Objektorientierung
leichter.

Thomas 'PointedEars' Lahn

unread,
Mar 21, 2012, 4:40:02 PM3/21/12
to
Juergen P. Meier wrote:

> Achim Peters <Achim...@gmx.de>:
>> Am 09.03.2012 10:21, schrieb Heiko Berges:
>>> http://utcc.utoronto.ca/~cks/space/blog/unix/HeadVsSed
>>>
>>> Wenn man dem Link "more shell, less egg" in dem Artikel folgt, kommt
>>> man lustigerweise zurück zum ursprünglichen Problem, seiner Lösung
>>
>> In einem Artikel von 2011 ein Script, was "das Alphabet" zur Erkennung
>> von Wörtern als "A-Za-z" definiert, explizit als "bug-free" zu
>> bewundern, hat was.
>
> Zumal Character-Ranges nur in der "C" bzw. "POSIX" locale definiert
> sind, und ausserhalb von LC_ALL=C unspezifiziert und teils ueberraschend
> Implementiert sind.

Zeichenbereiche sind selbstverständlich auch ausserhalb der "C"- oder
"POSIX"-Locale definiert. Und obwohl die Implementierung der Kollation
einige überraschen mag (bis vor einigen Monaten – *Deinem* Hinweis? – auch
mich), ist sie durchaus spezifiziert, z. B. im Unicode-Standard:

<http://unicode.org/reports/tr10/>

Bloss liegt die Spezifikation der jeweiligen Kollation ausserhalb von SUSv2+
bzw. POSIX. Das ist aber normal.

> Wenn dann [:alpha:], [:lower:] oder [:upper:]

ACK, so kann man das Problem für einige Bereiche umgehen. Leider nicht für
alle; höhere Programmiersprachen wie Perl und die GNU-textutils bieten hier
jedoch mit PCRE (Perl Compatible Regular Expressions)-Unterstützung, u. a.
Unicode-Zeicheneigenschaften (character properties, Escape-Sequenz `\p{…}'),
adäquate Lösungen.

--
PointedEars

Please do not Cc: me. / Bitte keine Kopien per E-Mail.
0 new messages