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.txtdruckt alle Wörter aus, 1 pro Zeile, und | sort -usortiert 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 -cwOption gibt grep die Anzahl der gefundenen Wortübereinstimmungen an. So können Sie die Gesamtzahl der patternVerwendungsvorfälle ermitteln grep -cw pattern words.txt.
Das Tool xargsermöglicht es uns, dies für jedes einzelne Wort zu tun, das von ausgegeben wird sort. Dies -Ipatternbedeutet, 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 shist erforderlich, da xargsnur ein einzelnes Programm unter seinem Namen ausgeführt werden kann und alles andere als Argumente übergeben wird. xargsbehandelt keine Dinge wie die Ersetzung von Befehlen. Der $(...)Befehl is substitution im obigen Snippet ersetzt die Ausgabe von grepin echound ermöglicht die korrekte Formatierung. Da wir die Befehlsersetzung benötigen, müssen wir den sh -cBefehl verwenden, der alles, was er erhält, als Argument in seiner eigenen Shell ausführt.