Linux shell script?
Hallo,
Ich wollte euch fragen ob ihr wisst wie ich mit einem shell/bash script in linux folgendes machen lassen:
Datei untersuchen, ergebnisse anzeigen
Beispiel Text:
Lorem Ipsum, 132, Lorem Ipsum, Lorem Ipsum
Lorem Ipsum, 234, 55
Lorem Ipsum,Lorem Ipsum, 55
Beispiel ergebnis:
55 kommt 2 mal vor
132 kommt 1 mal vor
234 kommt 1 mal vor
Ich freue mich über jede hilfe :)
2 Antworten
Das ganze kannst du mittels 'grep' und 'wc' realisieren. In einem Script z.B. so:
#!/bin/bash
count="$(grep -o -i "${1}" "${2}" | wc -l)"
echo "Die Zahl ${1} kommt ${count} mal in ${2} vor"
Wenn du jetzt das Script aufrufst, mit den zwei Parametern, also z.B.
bash counter.sh 55 test.txt
erhälst du das erwartete Ergebnis
Die Zahl 55 kommt 2 mal in test.txt vor
Anhand dessen kannst du das ja für die anderen Fälle, die du prüfen möchtest ausbauen..
grep ist eines der Werkzeuge, die du dafür vom Script aufrufen kannst, insbesondere mit der -c option. Dessen Ausgabe willst du dann eventuell filtern und deine eigene Ausgabe damit aufbauen.
Ansonsten kann es auch nützlich sein, für solche Aufgaben mal awk anzuschauen, auch aus einem shell script heraus aufrufbar, und sehr mächtig bezüglich Untersuchen von Texten und Reagieren auf zu definierbare Charakteristiken des Textes.
Für simples Zählen von String-vorkommen würd ich aber auf grep -c zurückgreifen.
Jo, das ist richtig. Aber macht es nicht unbrauchbar, denn Kommas gegen linefeeds zu ersetzen ist recht einfach - und davon hab ich abgesehen, weil das Beispiel keinen Hinweis darauf gibt, dass das vorkommen kann. Meine Erwartung war, dass, sollte dies nötig sein, dieser Fall auf zumindest einer Zeile gezeigt worden wäre - und da nicht, wollte ich den Tip nicht unnötig komplizieren mit etwas, was allen Anscheins nach unnötig ist.
Na, so kompliziert ist das auch wieder nicht:
cat Zaehltext.txt
Mähen Äbte Heu?
Nie mähen Äbte Heu.
Wenn Äbte mähen, mähen Äbte Gras.
Wenn man nur die Zeilen, in denen ein Muster vorkommt, zählen will:
fgrep -c 'Äbte' Zaehltext.txt
3
Will man dagegen wissen, wie oft das Muster tatsächlich vorkommt:
fgrep -o 'Äbte' Zaehltext.txt | wc -l
4
Da finde ich deine Idee, die Kommata durch Linefeeds zu ersetzen, umständlicher.
Mit Zeilenumbruch wär das dann auch in gedankliche Richtung gegangen, jedes Wort als hash in ein Array von Zählern zu verwenden, um Anzahl Vorkommen von beliebigem Wort im Nachhinein abfragen zu können, nicht nur ein Ergebnis pro Suchterm. Dafür wär es schon angenehm, ein Wort pro Zeile zu haben. Und das dann eventuell als "reinen" shell script, ohne externes grep oder awk oder fgrep.
grep -c zählt nur die Zeilen, in welchen ein String vorkommt. Sobald dieser aber in einer Zeile mehrfach vorkommt, erleidest du Schiffbruch.