PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash Wörter zählen



movco
21-03-2010, 11:16
Hallo ich muss aus einem Input die Wörter zählen und die > laut input ausgeben. Jetzt habe ich den Input zb.: (http://www.gutenberg.org/files/27761/27761-8.txt)

./wf 10 < hamlet
1522 the
922 of
900 to
887 and
691 a
687 i
534 you
526 in
480 footnote
400 my

Ich habe mal eine kleine Abfrage gemacht:
tr -s '\n' ' ' | tr -s ' ' '\n' | grep -i -w -c the;
Bekomme aber nur 1475 für the raus. Kann mir wer bitte helfen, müsste das Dienstag haben. Wo liegt der Fehler der Abfrage, oder gehe ich es falsch an?

LG

msi
21-03-2010, 15:38
deine lösung ignoriert solche fälle:


"...line ends.The house...."

ich würds spontan so machen:

perl -npe 's/[^a-zA-Z]/\n/g' | grep -iwc the

problem ist aber, dass

"the-
orem"

(wenn man so trennen würde...)

auch als the erkannt wird, klar theorem trennt man nicht so
aber du siehst worauf ich raus will

wenn du alle the finden willlst, also auch als teil in einem wort
kannst du das benutzen:

perl -e 'while(<>) { $c++ while s/the//i; } print "$c\n";'

movco
21-03-2010, 20:23
Danke mal, aber da kommt das auch nicht wirklich raus ...
Aber andere haben das schon gelöst (geben nur die Lösung nicht her) ;)

Als Hinweis war noch gegeben:
Hinweis: tr, sort, uniq und sed könnten hilfreich sein

LG

jeebee
21-03-2010, 21:27
schau mal was
uniq -c,
sort -rn und
sed 's/\([A-Z\)/\L\1/g' machen.

HTH jeebee

msi
21-03-2010, 22:14
Danke mal, aber da kommt das auch nicht wirklich raus ...
Aber andere haben das schon gelöst (geben nur die Lösung nicht her) ;)

Als Hinweis war noch gegeben:
Hinweis: tr, sort, uniq und sed könnten hilfreich sein

LG

wie ich dir vorher bereits geschrieben habe, gibts halt noch ein paar spezialfälle, das ist dann an dir die noch einzugrenzen.
evtl ist auch die musterlösung falsch, weil die in ihrem skript "the_" aus zB



_Enter the_ KING _and_ QUEEN, _preceded by_ POLONIUS, HAMLET,
LAERTES,[23] Lords, Ladies, _and_ Attendants.


nicht mitzählen, das musst du dir halt überlegen.

movco
22-03-2010, 16:25
Ok danke erstmal. Hab es jetzt geschafft und es passt. Nur habe ich jetzt eine Frage, ich möchte ja die Zeilenausgabe mit dem input beschränken.
$ARG=$1
und möchte es so ausgeben:
sed -ne '1,$ARG p';
das klappt aber nicht, wie kann ich die Variable hier richtig übergeben?

Bzgl. den Befehl:
sed 's/\([A-Z]\)/\L\1/g'
das wandelt alle Buchstaben in kleinbuchstaben, richtig?
Aber wie genau? Was machen die runden klammern? Und \L\1?

LG

jeebee
22-03-2010, 16:35
1:
ARG=$1
sed -ne "1,$ARG p"

2:
die runden Klammern bilden eine Gruppe, d.h. man kann das was innerhalb der Klammern gematcht wurde, später mit \1 wiederverwenden. das \L konvertiert das nächste Element (hier die Referenz zum gematchten Grossbuchstaben) zu Kleinbuchstaben.

bischi
22-03-2010, 16:57
Gab es nicht so was wie wc (word count)? Also als alleinstehendes Kommando?

MfG Bischi

jeebee
22-03-2010, 17:55
ja, aber wc kann laut manpage nicht die verschiedenen Wörter zählen (also 1720 the, 1050 a, ...) sondern nur die Anzahl Wörter, Zeilen oder Zeichen in einem Dokument.

bischi
22-03-2010, 21:05
Ah - ich hatte irgendwie nur den ersten Satz gelesen :p

MfG Bischi