hikaru hat geschrieben: 07.10.2021 08:52:21
Meillo hat geschrieben: 07.10.2021 07:51:43
Wenn mich nur das oder die haeufigsten interessieren, dann wuerde ich in Scripten normalerweise `sort -nr' nehmen (um absteigend zu sortieren) und dann von oben runter nur die ersten paar ausgeben. Das ist einfacher als vom Ende her.
Wir hatten das so ähnlich schon mal in fischigs Systemd-Paketsuch-Thread:
Ob die Sortierung aufsteigend oder absteigend ist halte ich für unerheblich. Die Eine ist genauso leserlich wie das Andere. Sie muss nur klar sein. Wenn dann die zusätzliche Anforderung kommt, die kürzeste Lösung zu liefern, dann ist
sort -r | head schlechter als
sort | tail.
Wenn man nicht nur das eine erste haben will, sondern wenn mehrere gleich oft vorkommen, dann geht das nur mit absteigender Sortierung (einfach). Wenn man die Ausgabe weiterverarbeiten will, dann ist es meist sinnvoll, die relevanten Werte zu Beginn zu haben. (Das ist meine Erfahrung.)
Meillo hat geschrieben: 07.10.2021 07:51:43
Dieses Konstrukt von inne gefaellt mir sehr gut:
D.h. als Alternative zu `head -n1'.
Warum? Es ist deutlich länger und ich meine auch schwerer lesbar als head.
Es macht etwas anderes, `head -n1' nimmt nur stur die erste Zeile. Der awk-Code nimmt alle Zeilen vom Anfang, bei denen das erste Feld gleich ist, d.h. wenn mehrere gleich haeufig sind, gibt es alle aus.
``Alternative'' war ein schlechter Begriff von mir. Gemeint habe ich, dass man das Konstrukt an die Stelle von `head -n1' setzt. Im Fall von nur einem am oeftesten vorkommenden Mittelteil tut es das Gleiche. Wenn aber mehrere gleich oft vorkommen, verhaelt es sich anders.
Meillo hat geschrieben: 07.10.2021 07:51:43
Ganz nett ist das `-x' Flag bei grep. Folgende zwei Aufrufe sind aequivalent:
-x ist aber länger.
Da hast du recht.
... Ich wollte nur etwas Werbung fuer `grep -x' machen, weil das Flag eher wenig bekannt ist, manchmal aber ganz nett ist. (U.a. kann es fuer Einsteiger einfacher sein als die Zeilenanker.)
Meillo hat geschrieben: 07.10.2021 07:51:43
Straight-forward:
- Mittelteil der 8-buchstabigen Woerter ausgeben
- sortieren
- zaehlen
- nach Haeufigkeit sortieren
- Zahl wegschneiden
- nur den ersten Eintrag
Meine Vermutung war, dass die Eingangswörterliste in diesem Spezialfall bereits sortiert ist, weshalb das erste
sort unnötig sein sollte. In der Praxis einsetzen würde ich es trotzdem, aber wen nach der kürzesten Lösung gefragt ist, wird dieses Detail relevant. Offenbar war meine Annahme falsch. Warum?
Es muss deshalb sortiert werden, weil zwar moeglicherweise die Wortliste sortiert war, aber es die Mittelteile damit nicht auch sind. Z.B.:
Das ergibt dann:
Und daraus macht `uniq -c' dann:
... wenn man sie nicht nochmal sortiert. Das sort sortiert ja nur die extrahierten Mittelteile und nicht die urspruengliche Wortliste.
Man kann sich merken, dass vor `uniq' fast immer sortiert werden muss. Jedenfalls ist es in meiner Praxis sehr selten, dass ich davor mal nicht sortieren will.
Ob "Zahl wegschneiden" Teil der Aufgabe ist, war für mich nicht eindeutig.
Es war ja insgesamt sehr offen wie die Ausgabe ueberhaupt aussehen soll.
Erstmal kann man ja einfach nur den haeufigsten Mittelteil ausgeben. Davon zu den Woerten zu kommen ist nicht allzu schwer (der Mittelteil steckt in $m):
Fuer die ganz harten Quoteing-Vermeider und Kurzcode-Schreiber gerne auch so:
(Ihr koennt euch ja mal klar machen, warum das so funktioniert.)
Bzw. fuer den Fall mehrerer haeufigster Mittelteile, falls man sie in eine Liste zusammenfassen will, z.B. in dieser Weise:
Code: Alles auswählen
... | sed 's,.*,..&..,' | grep -x -f- /usr/share/dict/ngerman