|
conjak_
Anmeldungsdatum: 12. Januar 2018
Beiträge: Zähle...
|
Hallo zusammen, bei mir steht eine wichtige Prüfung an und ich stehe leider bei einer Frage vom Prüfungskatalog an-> Ermitteln Sie die Zahl der Buchstaben und die Zahl der Wörter, welche insgesamt in Version1.txt und Version2.txt stehen. (Achtung: wieder nur ein Befehl!). Ich hätte schon einige Sachen ausprobiert mit wc oder grep.→ | ls -l l egrep [a-zA-Z] Version1.txt Version2.txt l wc -mw
|
Aber egal was ich eingebe, mir zeigt es die falsche Anzahl der Buchstaben an. Hat jemand eine Idee dazu? ☺ Danke, lG! Bearbeitet von sebix: Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!
|
|
sebix
Ehemalige
Anmeldungsdatum: 14. April 2009
Beiträge: 5584
|
Um Ausgaben an andere Programme weiterzugeben, vermendet man die Pipe, den senkrechten Strich |, kein kleines l. | grep -o '[a-zA-Z]' Version1.txt Version2.txt | wc -m
|
Und grep -o gibt dir nur die Zeichen aus, die auf das Suchmuster passen.
|
|
conjak_
(Themenstarter)
Anmeldungsdatum: 12. Januar 2018
Beiträge: Zähle...
|
Ursprünglich waren das mal Pipes, dürften beim kopieren passiert sein. Bei deinem Befehl bekomme ich eine Ausgebe von: 150
Ich habe jedoch in den zwei Dateien nur jeweils als Text: Zeile eingefügt - also sollte die Ausgabe ja eigentlich 10 sein!?
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17630
|
Meine erste Vermutung wäre, dass einfach dies gefragt ist:
| echo "Zahl" > v4
echo "Nr." > v3
cat v4 v3 | wc -cw
2 9
|
Ist die Frage, wie spitzfindig der Dozent ist. Buchstabe kann a-zA-Z (+äöüßÄÖÜßeéµ...) bedeuten oder eine laxe Übersetzung von 'Character'. Mag sein der Dozent hat dann immer lieber von Zeichen gesprochen, das musst Du wissen. Obwohl es nur 4 und 3 Zeichen zu sein scheinen, so gibt echo am Ende einen Zeilenumbruch mit aus, der auf unixoiden Systemen \n ist, also ein Zeichen. Schwache Betriebssysteme benötigen da zwei (\n\r).
|
|
sebix
Ehemalige
Anmeldungsdatum: 14. April 2009
Beiträge: 5584
|
Hoppla, so ist es richtig: | grep -ho '[a-zA-Z]' Version1.txt Version2.txt | wc -w
|
Also eine der vielen Moeglichkeiten.
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
conjak_ schrieb: Aber egal was ich eingebe, mir zeigt es die falsche Anzahl der Buchstaben an.
Ist das eventuell eine schlecht gestellte Aufgabe, bei der eigentlich Zeichen statt Buchstaben gemeint sind? wc zählt mit dem Argument -m alle Zeichen (characters) (also z.B. auch Whitespace wie Zeilenumbrüche, Tabs und Leerzeichen) und mit -w durch Whitespace getrennte Zeichengruppen.
Technisch gesehen wäre das folgende Python3-Skript ein Shell-Befehl, der alle Buchstaben bzw. Worte, die nur Buchstaben enthalten, zählt (falls alle non-Whitespace-Zeichen gemeint sind, kannst du das if w.isalpha() weglassen) 😛
python3 - Version{1,2}.txt <<EOF
import fileinput
words = [w for wil in (l.split() for l in fileinput.input()) for w in wil if w.isalpha()]
print("Worte:", len(words), "Buchstaben:", sum(map(len,words)))
EOF
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17630
|
@sebix:
Immer mal testen, was man so vorschlägt:
| grep -o '[a-zA-Z]' v3 v4
v3:N
v3:r
v4:Z
v4:a
v4:h
v4:l
|
Etwas besser:
| egrep -o '[a-zA-Z]+' v3 v4
v3:Nr
v4:Zahl
|
Hier wird der Name nur 1x je Datei ausgegeben und folglich gezählt. ☺
Ermitteln Sie die Zahl der Buchstaben und die Zahl der Wörter, welche insgesamt in Version1.txt und Version2.txt stehen. (Achtung: wieder nur ein Befehl!).
Würde man Buchstaben nicht wc-konform zählen wollen, sondern wirklich ohne Interpunktionszeichen usw., dann wird es schwierig mit wc. Die Datei könnte ja gemischte Zeichenketten enthalten, die schwierig als Wörter im Sinne der natürlichen Sprache zu klassifizieren sind ("Die Datei hat die Prüfsumme 0x11ab4d.") Wieviele Buchstaben, wieviele Wörter sind das? Splittet man mit grep/sed/..., so fallen hinten die Wörter x, ab und d raus - schwerlich Wörter. Drückt man da aber ein Auge zu und sagt 0x11ab4d ist ein Wort, dann kann man den Punkt auch mit drankleben und auf 6 Wörter kommen. Alles nicht so einfach. ☺ Da musst Du erriechen, was das Niveau ist. Die Pipe mit wc jedenfalls weglassen, um zu kontrollieren, wenn wc merkwürdig zählt. | cat v3 v4 | egrep -o "[a-zA-Z]+"
Nr
Zahl
cat v3 v4 | egrep -o "[a-zA-Z]+" | wc -mw
2 8
|
Ohne Interpunktionszeichen, aber mit Umbrüchen, zählt wc so die Buchstaben. Da könnte man jetzt noch die Zahl der Dateien abziehen mit überproportionalem Aufwand. ☺
|
|
sebix
Ehemalige
Anmeldungsdatum: 14. April 2009
Beiträge: 5584
|
user_unknown schrieb: @sebix:
Immer mal testen, was man so vorschlägt:
| grep -o '[a-zA-Z]' v3 v4
v3:N
v3:r
v4:Z
v4:a
v4:h
v4:l
|
Ohne dem Dateinamen passt das ja, denn wc -m zaehlt die Umbrueche nicht. Etwas besser:
| egrep -o '[a-zA-Z]+' v3 v4
v3:Nr
v4:Zahl
|
Hier wird der Name nur 1x je Datei ausgegeben und folglich gezählt. ☺
Was man ja auch nicht will. Es sollen ja Zeichen und nicht Woerter gezaehlt werden. Und fuer wc ist ein Umbruch ein Zeichen. Deshalb mein Vorschlag mit dem Zaehlen der Woerter, und ein Wort ist aber immer ein Buchstabe. user_unknown schrieb: Ohne Interpunktionszeichen, aber mit Umbrüchen, zählt wc so die Buchstaben.
Und meine (korrigerte) Variante zaehlt die Umbrueche nicht mit.
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17630
|
seahawk1986 schrieb: conjak_ schrieb: Aber egal was ich eingebe, mir zeigt es die falsche Anzahl der Buchstaben an.
Ist das eventuell eine schlecht gestellte Aufgabe, bei der eigentlich Zeichen statt Buchstaben gemeint sind?
Trotzdem werden es nicht 150. ☺
wc zählt mit dem Argument -m alle Zeichen (characters) (also z.B. auch Whitespace wie Zeilenumbrüche, Tabs und Leerzeichen) und mit -w durch Whitespace getrennte Zeichengruppen.
Und was kommt dabei raus?
Technisch gesehen wäre das folgende Python3-Skript ein Shell-Befehl, der alle Buchstaben bzw. Worte, die nur Buchstaben enthalten, zählt (falls alle non-Whitespace-Zeichen gemeint sind, kannst du das if w.isalpha() weglassen) 😛
python3 - Version{1,2}.txt <<EOF
import fileinput
words = [w for wil in (l.split() for l in fileinput.input()) for w in wil if w.isalpha()]
print("Worte:", len(words), "Buchstaben:", sum(map(len,words)))
EOF
Fragt sich, wie man Worte definiert, wenn man bei Buchstaben die nat. Sprache zu Grunde legt. ☺ Also sind wahrscheinlich Characters gemeint, zumal nichts über Umlaute, griechische und kyrillische Buchstaben, Kanji, Arabisch und Réné gesagt wird.
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17630
|
sebix schrieb: Hoppla, so ist es richtig: | grep -ho '[a-zA-Z]' Version1.txt Version2.txt | wc -w
|
So ist es auch nicht richtig. Gefordert war in einem Befehl auch die Wortzahl zu ermitteln. ☺
Ermitteln Sie die Zahl der Buchstaben und die Zahl der Wörter, welche insgesamt in Version1.txt und Version2.txt stehen. (Achtung: wieder nur ein Befehl!).
Also weder für die Dateien getrennt ausgeben, noch nur die Wortzahlsumme. 90% der Softwareprojekte scheitern an misslungener Kommunikation zw. Auftraggeber und Programmierer. Der Auftraggeber sagt "Kunde, Rechnung, speichern, ..." - der Programmierer versteht "HashMap, Docker, Git, Cloud".
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
user_unknown schrieb:
Und was kommt dabei raus?
Ohne den Inhalt der Dateien zu kennen ist das schwer zu beantworten... An einer Beispiel-Datei passt es auch mit UTF-Zeichen, die mehr als ein Byte breit sind:
$ cat text.txt
1234567890 11 abc
1234567890 äöü.
1234567890
$ xxd text.txt
00000000: 3132 3334 3536 3738 3930 2031 3120 6162 1234567890 11 ab
00000010: 630a 3132 3334 3536 3738 3930 20c3 a4c3 c.1234567890 ...
00000020: b6c3 bc2e 0a31 3233 3435 3637 3839 300a .....1234567890.
$ wc -mw text.txt
6 45 text.txt In dem Fall also 6 Wörter und 45 Zeichen (davon 3 Spaces und 3 Newlines), was einem auch das Python-Skript verrät, wenn man es den Whitespace entfernen lässt:
$ python - text.txt <<EOF
import fileinput
words = [w for wil in (l.split() for l in fileinput.input()) for w in wil]
print("Worte:", len(words), "druckbare Zeichen:", sum(map(len,words)))
EOF
Worte: 6 druckbare Zeichen: 39
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
|
Hi conjak_, zuerst mal herzlich willkommen hier auf dem Forum ! Die Aufgabe ist doch das reine Zählen der Zeichen und der Wörter im den beiden Dateien ... verstehe ich das richtig ? Das klingt ganz einfach nach einer Aufgabe für wc , würde ich mal sagen: track@track:~$ wc -m -w blubb bla
37 205 blubb
29 128 bla
66 333 insgesamt (die Zeilen haben ich weggelassen, danach war ja nicht gefragt) Wie gewohnt, findest Du die Details zum Befehl in man wc . Oder gibt es bei der Aufgabenstellung noch einen Pferdefuß ? LG, track p.s.: Um wirklich richtig antworten zu können, bräuchten wir im Grunde noch ein paar mehr Informationen: Welche Befehle habe Ihr bisher behandelt ? - wie wörtlich ist das mit den "Buchstaben" zu verstehen ? - und das "insgesamt" (wirklich nur die Summe von beiden Dateien ?) - wie wörtlich meinen sie "ein Befehl ? (ist also keine Pipe erlaubt ?)
|
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9837
|
conjak_ schrieb: […] Ermitteln Sie die Zahl der Buchstaben und die Zahl der Wörter, welche insgesamt in Version1.txt und Version2.txt stehen. (Achtung: wieder nur ein Befehl!).
Die Aufgabe ist ungenau gestellt und daher ohne weitere Information oder Interpretation nicht lösbar. Was ist mit „Buchstabe“ gemeint? Je nach Region wird man diese Frage unterschiedlich beantworten, z.B.:
Im deutschen Sprachraum außerhalb der Schweiz wird man mit a-z, ä, ö, ü, ß, A-Z, Ä, Ö, Ü antworten und sich vielleicht unsicher sein, ob man neuerdings auch noch ein „großes ß“ hinzufügen sollte. Im deutschen Sprachraum der Schweiz wird man das „ß“ jedenfalls nicht dazu zählen. Im europäischen Ausland und erst recht in anderen Kulturen (Arabien, Japan, China, Indien, …) wird man die Frage ganz anders beantworten.
Ich nehme jetzt mal an, dass die oben beschriebene Menge der Buchstaben des deutschen Alphabets gemeint ist und verwende zum Test die so erzeugte Datei: echo äöüß ÄÖÜ > Umlaute Mit wc Umlaute
1 2 16 Umlaute findet man 1 Zeile, 2 Worte und 16 Bytes. Jedoch enthält die Datei nur 7 Buchstaben im präzisierten Sinne. Dies erkennt man mit der Option -m von wc, wenn man vorher alles löscht, was kein Buchstabe des deutschen Alphabets ist:
cat Umlaute | tr -c -d 'a-zäöüßA-Z' | wc -m Mit dieser Methode kann man auch leicht die Summe über mehrere Dateien ermitteln: cat Version1.txt Version2.txt | tr -c -d 'a-zäöüßA-Z' | wc -m Jedoch kann man nicht gleichzeitig die Anzahl der Worte ermitteln, da man ja auch die Leerzeichen löscht. Die Anzahl der Worte (auch hier die Frage: Was meint „Wort“? Ist „a13“ ein „Wort“? Oder „4711“? ) liefert jedenfalls die Option -w von wc: cat Umlaute | tr -c -d 'a-z äöüßA-ZÄÖÜ\t' | wc -w
cat Version1.txt Version2.txt | tr -c -d 'a-z äöüßA-Z\t' | wc -w (Beachte Leerzeichen und Tabulator in der Auswahl!)
|