Eine Lösung, die mehrere Programme von einer Shell aus aufruft:
fmt -1 words.txt | sort -u | xargs -Ipattern sh -c 'echo "pattern:$(grep -cw pattern words.txt)"'
Eine kleine Erklärung:
Das fmt -1 words.txt
druckt alle Wörter aus, 1 pro Zeile, und | sort -u
sortiert diese Ausgabe und extrahiert nur die eindeutigen Wörter daraus.
Um das Vorkommen eines Wortes in einer Datei zu zählen, kann man grep
(ein Werkzeug zum Durchsuchen von Dateien nach Mustern) verwenden. Durch Übergeben der -cw
Option gibt grep die Anzahl der gefundenen Wortübereinstimmungen an. So können Sie die Gesamtzahl der pattern
Verwendungsvorfälle ermitteln grep -cw pattern words.txt
.
Das Tool xargs
ermöglicht es uns, dies für jedes einzelne Wort zu tun, das von ausgegeben wird sort
. Dies -Ipattern
bedeutet, dass der folgende Befehl mehrmals ausgeführt wird, wobei jedes Vorkommen eines Musters durch ein Wort ersetzt wird, das von der Standardeingabe gelesen wird sort
.
Die Indirektion mit sh
ist erforderlich, da xargs
nur ein einzelnes Programm unter seinem Namen ausgeführt werden kann und alles andere als Argumente übergeben wird. xargs
behandelt keine Dinge wie die Ersetzung von Befehlen. Der $(...)
Befehl is substitution im obigen Snippet ersetzt die Ausgabe von grep
in echo
und ermöglicht die korrekte Formatierung. Da wir die Befehlsersetzung benötigen, müssen wir den sh -c
Befehl verwenden, der alles, was er erhält, als Argument in seiner eigenen Shell ausführt.